+++ /dev/null
-#!/usr/bin/env bash
-
-
-## Copyright (C) 2012 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-## 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/>.
-
-## Commentary:
-
-# Preconfigured Emacs with a basic helm configuration.
-# Useful to start quickly an emacs -Q with helm.
-# Run it from this directory or symlink it somewhere in your PATH.
-
-# If TEMP env var exists use it otherwise declare it.
-[ -z $TEMP ] && declare TEMP="/tmp"
-
-CONF_FILE="$TEMP/helm-cfg.el"
-EMACS=emacs
-
-case $1 in
- -P)
- shift 1
- declare EMACS=$1
- shift 1
- ;;
- -h)
- echo "Usage: ${0##*/} [-P} Emacs path [-h} help [--] EMACS ARGS"
- exit 2
- ;;
-esac
-
-cd $(dirname "$0")
-
-# Check if autoload file exists.
-# It is maybe in a different directory if
-# emacs-helm.sh is a symlink.
-LS=$(ls -l $0 | awk '{print $11}')
-if [ ! -z $LS ]; then
- AUTO_FILE="$(dirname $LS)/helm-autoloads.el"
-else
- AUTO_FILE="helm-autoloads.el"
-fi
-if [ ! -e "$AUTO_FILE" ]; then
- echo No autoloads found, please run make first to generate autoload file
- exit 2
-fi
-
-
-cat > $CONF_FILE <<EOF
-(setq initial-scratch-message (concat initial-scratch-message
-";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\
-;; This Emacs is Powered by \`HELM' using\n\
-;; emacs program \"$EMACS\".\n\
-;; This is a minimal \`helm' configuration to discover \`helm' or debug it.\n\
-;; You can retrieve this minimal configuration in \"$CONF_FILE\" \n\
-;; Some originals emacs commands have been replaced by own \`helm' commands:\n\n\
-;; - \`find-file'(C-x C-f) =>\`helm-find-files'\n\
-;; - \`occur'(M-s o) =>\`helm-occur'\n\
-;; - \`list-buffers'(C-x C-b) =>\`helm-buffers-list'\n\
-;; - \`completion-at-point'(M-tab) =>\`helm-lisp-completion-at-point'[1]\n\
-;; - \`dabbrev-expand'(M-/) =>\`helm-dabbrev'\n\n\
-;; Some others native emacs commands are \"helmized\" by \`helm-mode'.\n\
-;; [1] Coming with emacs-24.4 \`completion-at-point' is \"helmized\" by \`helm-mode'\n\
-;; which provide helm completion in many other places like \`shell-mode'.\n\
-;; You will find embeded help for most helm commands with \`C-c ?'.\n\
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n"))
-
-(setq package-load-list '((helm-core t) (helm t) (async t)))
-(package-initialize)
-(add-to-list 'load-path (file-name-directory (file-truename "$0")))
-(setq default-frame-alist '((vertical-scroll-bars . nil)
- (tool-bar-lines . 0)
- (menu-bar-lines . 0)
- (fullscreen . nil)))
-(blink-cursor-mode -1)
-(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)
-(global-set-key (kbd "M-x") 'helm-M-x)
-(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))
-(add-hook 'kill-emacs-hook #'(lambda () (and (file-exists-p "$CONF_FILE") (delete-file "$CONF_FILE"))))
-EOF
-
-$EMACS -Q -l $CONF_FILE $@
-
+++ /dev/null
-;;; helm-adaptive.el --- Adaptive Sorting of Candidates. -*- lexical-binding: t -*-
-
-;; Original Author: Tamas Patrovics
-
-;; Copyright (C) 2007 Tamas Patrovics
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-
-\f
-(defgroup helm-adapt nil
- "Adaptative sorting of candidates for Helm."
- :group 'helm)
-
-(defcustom helm-adaptive-history-file
- "~/.emacs.d/helm-adaptive-history"
- "Path of file where history information is stored."
- :type 'string
- :group 'helm-adapt)
-
-(defcustom helm-adaptive-history-length 50
- "Maximum number of candidates stored for a source."
- :type 'number
- :group 'helm-adapt)
-
-\f
-;; Internal
-(defvar helm-adaptive-done nil
- "nil if history information is not yet stored for the current
-selection.")
-
-(defvar helm-adaptive-history nil
- "Contains the stored history information.
-Format: ((SOURCE-NAME (SELECTED-CANDIDATE (PATTERN . NUMBER-OF-USE) ...) ...) ...)")
-
-(defun helm-adaptive-done-reset ()
- (setq helm-adaptive-done nil))
-
-;;;###autoload
-(define-minor-mode helm-adaptive-mode
- "Toggle adaptive sorting in all sources."
- :group 'helm-adapt
- :require 'helm-adaptive
- :global t
- (if helm-adaptive-mode
- (progn
- (unless helm-adaptive-history
- (helm-adaptive-maybe-load-history))
- (add-hook 'kill-emacs-hook 'helm-adaptive-save-history)
- ;; Should run at beginning of `helm-initial-setup'.
- (add-hook 'helm-before-initialize-hook 'helm-adaptive-done-reset)
- ;; Should run at beginning of `helm-exit-minibuffer'.
- (add-hook 'helm-before-action-hook 'helm-adaptive-store-selection)
- ;; Should run at beginning of `helm-select-action'.
- (add-hook 'helm-select-action-hook 'helm-adaptive-store-selection))
- (helm-adaptive-save-history)
- (setq helm-adaptive-history nil)
- (remove-hook 'kill-emacs-hook 'helm-adaptive-save-history)
- (remove-hook 'helm-before-initialize-hook 'helm-adaptive-done-reset)
- (remove-hook 'helm-before-action-hook 'helm-adaptive-store-selection)
- (remove-hook 'helm-select-action-hook 'helm-adaptive-store-selection)))
-
-(defun helm-adapt-use-adaptive-p (&optional source-name)
- "Return current source only if it use adaptive history, nil otherwise."
- (when helm-adaptive-mode
- (let* ((source (or source-name (helm-get-current-source)))
- (adapt-source (or (assoc-default 'filtered-candidate-transformer
- (assoc (assoc-default 'type source)
- helm-type-attributes))
- (assoc-default 'candidate-transformer
- (assoc (assoc-default 'type source)
- helm-type-attributes))
- (assoc-default 'filtered-candidate-transformer source)
- (assoc-default 'candidate-transformer source))))
- (if (listp adapt-source)
- (and (member 'helm-adaptive-sort adapt-source) source)
- (and (eq adapt-source 'helm-adaptive-sort) source)))))
-
-(defun helm-adaptive-store-selection ()
- "Store history information for the selected candidate."
- (unless helm-adaptive-done
- (setq helm-adaptive-done t)
- (let ((source (helm-adapt-use-adaptive-p)))
- (when source
- (let* ((source-name (or (assoc-default 'type source)
- (assoc-default 'name source)))
- (source-info (or (assoc source-name helm-adaptive-history)
- (progn
- (push (list source-name) helm-adaptive-history)
- (car helm-adaptive-history))))
- (selection (helm-get-selection))
- (selection-info (progn
- (setcdr source-info
- (cons
- (let ((found (assoc selection (cdr source-info))))
- (if (not found)
- ;; new entry
- (list selection)
- ;; move entry to the beginning of the
- ;; list, so that it doesn't get
- ;; trimmed when the history is
- ;; truncated
- (setcdr source-info
- (delete found (cdr source-info)))
- found))
- (cdr source-info)))
- (cadr source-info)))
- (pattern-info (progn
- (setcdr selection-info
- (cons
- (let ((found (assoc helm-pattern (cdr selection-info))))
- (if (not found)
- ;; new entry
- (cons helm-pattern 0)
-
- ;; move entry to the beginning of the
- ;; list, so if two patterns used the
- ;; same number of times then the one
- ;; used last appears first in the list
- (setcdr selection-info
- (delete found (cdr selection-info)))
- found))
- (cdr selection-info)))
- (cadr selection-info))))
-
- ;; increase usage count
- (setcdr pattern-info (1+ (cdr pattern-info)))
-
- ;; truncate history if needed
- (if (> (length (cdr selection-info)) helm-adaptive-history-length)
- (setcdr selection-info
- (cl-subseq (cdr selection-info) 0 helm-adaptive-history-length))))))))
-
-(defun helm-adaptive-maybe-load-history ()
- "Load `helm-adaptive-history-file' which contain `helm-adaptive-history'.
-Returns nil if `helm-adaptive-history-file' doesn't exist."
- (when (file-readable-p helm-adaptive-history-file)
- (load-file helm-adaptive-history-file)))
-
-(defun helm-adaptive-save-history (&optional arg)
- "Save history information to file given by `helm-adaptive-history-file'."
- (interactive "p")
- (with-temp-buffer
- (insert
- ";; -*- mode: emacs-lisp -*-\n"
- ";; History entries used for helm adaptive display.\n")
- (prin1 `(setq helm-adaptive-history ',helm-adaptive-history)
- (current-buffer))
- (insert ?\n)
- (write-region (point-min) (point-max) helm-adaptive-history-file nil
- (unless arg 'quiet))))
-
-(defun helm-adaptive-sort (candidates source)
- "Sort the CANDIDATES for SOURCE by usage frequency.
-This is a filtered candidate transformer you can use with the
-`filtered-candidate-transformer' attribute."
- (let* ((source-name (or (assoc-default 'type source)
- (assoc-default 'name source)))
- (source-info (assoc source-name helm-adaptive-history)))
- (if source-info
- (let ((usage
- ;; ... assemble a list containing the (CANIDATE . USAGE-COUNT)
- ;; pairs
- (mapcar (lambda (candidate-info)
- (let ((count 0))
- (cl-dolist (pattern-info (cdr candidate-info))
- (if (not (equal (car pattern-info)
- helm-pattern))
- (cl-incf count (cdr pattern-info))
-
- ;; if current pattern is equal to the previously
- ;; used one then this candidate has priority
- ;; (that's why its count is boosted by 10000) and
- ;; it only has to compete with other candidates
- ;; which were also selected with the same pattern
- (setq count (+ 10000 (cdr pattern-info)))
- (cl-return)))
- (cons (car candidate-info) count)))
- (cdr source-info))))
- (if (and usage (consp usage))
- ;; sort the list in descending order, so candidates with highest
- ;; priorty come first
- (progn
- (setq usage (sort usage (lambda (first second)
- (> (cdr first) (cdr second)))))
-
- ;; put those candidates first which have the highest usage count
- (cl-loop for (info . _freq) in usage
- for member = (cl-member info candidates
- :test 'helm-adaptive-compare)
- when member collect (car member) into sorted
- and do
- (setq candidates (cl-remove info candidates
- :test 'helm-adaptive-compare))
- finally return (append sorted candidates)))
- (message "Your `%s' is maybe corrupted or too old, \
-you should reinitialize it with `helm-reset-adaptive-history'"
- helm-adaptive-history-file)
- (sit-for 1)
- candidates))
- ;; if there is no information stored for this source then do nothing
- candidates)))
-
-;;;###autoload
-(defun helm-reset-adaptive-history ()
- "Delete all `helm-adaptive-history' and his file.
-Useful when you have a old or corrupted `helm-adaptive-history-file'."
- (interactive)
- (when (y-or-n-p "Really delete all your `helm-adaptive-history'? ")
- (setq helm-adaptive-history nil)
- (delete-file helm-adaptive-history-file)))
-
-(defun helm-adaptive-compare (x y)
- "Compare candidates X and Y taking into account that the
-candidate can be in (DISPLAY . REAL) format."
- (equal (if (listp x) (cdr x) x)
- (if (listp y) (cdr y) y)))
-
-
-(provide 'helm-adaptive)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-adaptive.el ends here
+++ /dev/null
-;;; helm-apt.el --- Helm interface for Debian/Ubuntu packages (apt-*) -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-utils)
-(require 'helm-external)
-(require 'helm-help)
-
-(declare-function term-line-mode "term")
-(declare-function term-char-mode "term")
-(declare-function term-send-input "term")
-(declare-function term-send-eof "term")
-
-\f
-(defgroup helm-apt nil
- "Apt related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-apt-cache-show-function 'helm-apt-cache-show-1
- "Function of one argument used to show apt package.
-Default is `helm-apt-cache-show-1' but you can use `apt-utils-show-package-1'
-from `apt-utils.el' to have something more enhanced.
-If nil default `helm-apt-cache-show-1' will be used."
- :type 'function
- :group 'helm-apt)
-
-(defcustom helm-apt-actions
- '(("Show package description" . helm-apt-cache-show)
- ("Install package(s)" . helm-apt-install)
- ("Reinstall package(s)" . helm-apt-reinstall)
- ("Remove package(s)" . helm-apt-uninstall)
- ("Purge package(s)" . helm-apt-purge))
- "Actions for helm apt."
- :group 'helm-apt
- :type '(alist :key-type string :value-type function))
-
-(defface helm-apt-installed
- '((t (:foreground "green")))
- "Face used for apt installed candidates."
- :group 'helm-apt)
-
-(defface helm-apt-deinstalled
- '((t (:foreground "DimGray")))
- "Face used for apt deinstalled candidates."
- :group 'helm-apt)
-
-\f
-(defvar helm-apt-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-I") 'helm-apt-show-only-installed)
- (define-key map (kbd "M-U") 'helm-apt-show-only-not-installed)
- (define-key map (kbd "M-D") 'helm-apt-show-only-deinstalled)
- (define-key map (kbd "M-A") 'helm-apt-show-all)
- map))
-
-\f
-(defvar helm-source-apt
- (helm-build-in-buffer-source "APT"
- :init #'helm-apt-init
- :candidate-transformer #'helm-apt-candidate-transformer
- :display-to-real #'helm-apt-display-to-real
- :update #'helm-apt-refresh
- :keymap helm-apt-map
- :help-message 'helm-apt-help-message
- :action 'helm-apt-actions
- :persistent-action #'helm-apt-persistent-action
- :persistent-help "Show package description"))
-
-;;; Internals vars
-(defvar helm-apt-search-command "apt-cache search '%s'")
-(defvar helm-apt-show-command "apt-cache show '%s'")
-(defvar helm-apt-installed-packages nil)
-(defvar helm-apt-all-packages nil)
-(defvar helm-apt-input-history nil)
-(defvar helm-apt-show-only 'all)
-(defvar helm-apt-term-buffer nil)
-(defvar helm-apt-default-archs nil)
-
-(defun helm-apt-refresh ()
- "Refresh installed candidates list."
- (setq helm-apt-installed-packages nil)
- (setq helm-apt-all-packages nil))
-
-(defun helm-apt-persistent-action (candidate)
- "Persistent action for APT source."
- (helm-apt-cache-show candidate))
-
-(defun helm-apt--installed-package-name (name)
- (cl-loop for arch in helm-apt-default-archs
- thereis (or (assoc-default
- name helm-apt-installed-packages)
- (assoc-default
- (format "%s:%s" name arch)
- helm-apt-installed-packages))))
-
-(defun helm-apt-candidate-transformer (candidates)
- "Show installed CANDIDATES and the ones to deinstall in a different color."
- (cl-loop for cand in candidates
- for name = (helm-apt-display-to-real cand)
- for deinstall = (string=
- (helm-apt--installed-package-name name)
- "deinstall")
- for install = (string=
- (helm-apt--installed-package-name name)
- "install")
- for show = (cond ((and deinstall
- (memq helm-apt-show-only '(all deinstalled)))
- (propertize cand 'face 'helm-apt-deinstalled))
- ((and install
- (memq helm-apt-show-only '(all installed)))
- (propertize cand 'face 'helm-apt-installed))
- ((and (eq helm-apt-show-only 'noinstalled)
- (not install)) cand)
- ((eq helm-apt-show-only 'all) cand))
- when show collect show))
-
-(defun helm-apt-show-only-installed ()
- (interactive)
- (when helm-alive-p
- (setq helm-apt-show-only 'installed)
- (helm-update)))
-
-(defun helm-apt-show-only-not-installed ()
- (interactive)
- (when helm-alive-p
- (setq helm-apt-show-only 'noinstalled)
- (helm-update)))
-
-(defun helm-apt-show-only-deinstalled ()
- (interactive)
- (when helm-alive-p
- (setq helm-apt-show-only 'deinstalled)
- (helm-update)))
-
-(defun helm-apt-show-all ()
- (interactive)
- (when helm-alive-p
- (setq helm-apt-show-only 'all)
- (helm-update)))
-
-(defun helm-apt-init ()
- "Initialize list of debian packages."
- (let ((query ""))
- (unless (and helm-apt-installed-packages
- helm-apt-all-packages)
- (message "Loading package list...")
- (setq helm-apt-installed-packages
- (with-temp-buffer
- (call-process-shell-command "dpkg --get-selections"
- nil (current-buffer))
- (cl-loop for i in (split-string (buffer-string) "\n" t)
- for p = (split-string i)
- collect (cons (car p) (cadr p)))))
- (helm-init-candidates-in-buffer
- 'global
- (setq helm-apt-all-packages
- (with-temp-buffer
- (call-process-shell-command
- (format helm-apt-search-command query)
- nil (current-buffer))
- (buffer-string))))
- (message "Loading package list done")
- (sit-for 0.5))))
-
-(defun helm-apt-display-to-real (line)
- "Return only name of a debian package.
-LINE is displayed like:
-package name - description."
- (car (split-string line " - ")))
-
-(defvar helm-apt-show-current-package nil)
-(define-derived-mode helm-apt-show-mode
- special-mode "helm-apt-show"
- "Mode to display infos on apt packages.")
-
-(defun helm-apt-cache-show (package)
- "Show information on apt package PACKAGE."
- (if (and (functionp helm-apt-cache-show-function)
- (not (eq helm-apt-cache-show-function
- 'helm-apt-cache-show)))
- ;; A function, call it.
- (funcall helm-apt-cache-show-function package)
- ;; nil or whatever use default.
- (helm-apt-cache-show-1 package)))
-
-(defun helm-apt-cache-show-1 (package)
- (let* ((command (format helm-apt-show-command package))
- (buf (get-buffer-create "*helm apt show*")))
- (switch-to-buffer buf)
- (unless (string= package helm-apt-show-current-package)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (save-excursion
- (call-process-shell-command
- command nil (current-buffer) t))))
- (helm-apt-show-mode)
- (set (make-local-variable 'helm-apt-show-current-package)
- package)))
-
-(defun helm-apt-install (_package)
- "Run 'apt-get install' shell command on PACKAGE."
- (helm-apt-generic-action :action 'install))
-
-(defun helm-apt-reinstall (_package)
- "Run 'apt-get install --reinstall' shell command on PACKAGE."
- (helm-apt-generic-action :action 'reinstall))
-
-(defun helm-apt-uninstall (_package)
- "Run 'apt-get remove' shell command on PACKAGE."
- (helm-apt-generic-action :action 'uninstall))
-
-(defun helm-apt-purge (_package)
- "Run 'apt-get purge' shell command on PACKAGE."
- (helm-apt-generic-action :action 'purge))
-
-(cl-defun helm-apt-generic-action (&key action)
- "Run 'apt-get ACTION'.
-Support install, remove and purge actions."
- (if (and helm-apt-term-buffer
- (buffer-live-p (get-buffer helm-apt-term-buffer)))
- (switch-to-buffer helm-apt-term-buffer)
- (ansi-term (getenv "SHELL") "term apt")
- (setq helm-apt-term-buffer (buffer-name)))
- (term-line-mode)
- (let ((command (cl-case action
- (install "sudo apt-get install ")
- (reinstall "sudo apt-get install --reinstall ")
- (uninstall "sudo apt-get remove ")
- (purge "sudo apt-get purge ")
- (t (error "Unknown action"))))
- (beg (point))
- end
- (cand-list (mapconcat (lambda (x) (format "'%s'" x))
- (helm-marked-candidates) " ")))
- (goto-char (point-max))
- (insert (concat command cand-list))
- (setq end (point))
- (if (y-or-n-p (format "%s package(s)" (symbol-name action)))
- (progn
- (setq helm-external-commands-list nil)
- (setq helm-apt-installed-packages nil)
- (term-char-mode) (term-send-input))
- (delete-region beg end))))
-
-;;;###autoload
-(defun helm-apt (arg)
- "Preconfigured `helm' : frontend of APT package manager.
-With a prefix arg reload cache."
- (interactive "P")
- (setq helm-apt-show-only 'all)
- (unless helm-apt-default-archs
- (setq helm-apt-default-archs
- (append (split-string
- (shell-command-to-string
- "dpkg --print-architecture")
- "\n" t)
- (split-string
- (shell-command-to-string
- "dpkg --print-foreign-architectures")
- "\n" t))))
- (let ((query (read-string "Search Package: " nil 'helm-apt-input-history)))
- (when arg (helm-apt-refresh))
- (helm :sources 'helm-source-apt
- :prompt "Search Package: "
- :input query
- :buffer "*helm apt*"
- :history 'helm-apt-input-history)))
-
-
-(provide 'helm-apt)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-apt.el ends here
+++ /dev/null
-;;; helm-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-(add-to-list 'load-path (or (file-name-directory #$) (car load-path)))
-\f
-;;;### (autoloads nil "helm-adaptive" "helm-adaptive.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-adaptive.el
-
-(defvar helm-adaptive-mode nil "\
-Non-nil if Helm-Adaptive mode is enabled.
-See the command `helm-adaptive-mode' for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `helm-adaptive-mode'.")
-
-(custom-autoload 'helm-adaptive-mode "helm-adaptive" nil)
-
-(autoload 'helm-adaptive-mode "helm-adaptive" "\
-Toggle adaptive sorting in all sources.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'helm-reset-adaptive-history "helm-adaptive" "\
-Delete all `helm-adaptive-history' and his file.
-Useful when you have a old or corrupted `helm-adaptive-history-file'.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-apt" "helm-apt.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-apt.el
-
-(autoload 'helm-apt "helm-apt" "\
-Preconfigured `helm' : frontend of APT package manager.
-With a prefix arg reload cache.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-bookmark" "helm-bookmark.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-bookmark.el
-
-(autoload 'helm-bookmarks "helm-bookmark" "\
-Preconfigured `helm' for bookmarks.
-
-\(fn)" t nil)
-
-(autoload 'helm-filtered-bookmarks "helm-bookmark" "\
-Preconfigured helm for bookmarks (filtered by category).
-Optional source `helm-source-bookmark-addressbook' is loaded
-only if external library addressbook-bookmark.el is available.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-buffers" "helm-buffers.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-buffers.el
-
-(autoload 'helm-buffers-list "helm-buffers" "\
-Preconfigured `helm' to list buffers.
-
-\(fn)" t nil)
-
-(autoload 'helm-mini "helm-buffers" "\
-Preconfigured `helm' lightweight version (buffer -> recentf).
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-color" "helm-color.el" (22156 56359 0
-;;;;;; 0))
-;;; Generated autoloads from helm-color.el
-
-(autoload 'helm-colors "helm-color" "\
-Preconfigured `helm' for color.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-command" "helm-command.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-command.el
-
-(autoload 'helm-M-x "helm-command" "\
-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, are passed AFTER starting `helm-M-x'.
-
-You can get help on each command by persistent action.
-
-\(fn ARG &optional COMMAND-NAME)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-config" "helm-config.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-config.el
-
-(autoload 'helm-configuration "helm-config" "\
-Customize `helm'.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-dabbrev" "helm-dabbrev.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-dabbrev.el
-
-(autoload 'helm-dabbrev "helm-dabbrev" "\
-Preconfigured helm for dynamic abbreviations.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-elisp" "helm-elisp.el" (22156 56359 0
-;;;;;; 0))
-;;; Generated autoloads from helm-elisp.el
-
-(autoload 'helm-lisp-completion-at-point "helm-elisp" "\
-Preconfigured helm for lisp symbol completion at point.
-
-\(fn)" t nil)
-
-(autoload 'helm-complete-file-name-at-point "helm-elisp" "\
-Preconfigured helm to complete file name at point.
-
-\(fn &optional FORCE)" t nil)
-
-(autoload 'helm-lisp-indent "helm-elisp" "\
-
-
-\(fn)" t nil)
-
-(autoload 'helm-lisp-completion-or-file-name-at-point "helm-elisp" "\
-Preconfigured helm to complete lisp symbol or filename at point.
-Filename completion happen if string start after or between a double quote.
-
-\(fn)" t nil)
-
-(autoload 'helm-apropos "helm-elisp" "\
-Preconfigured helm to describe commands, functions, variables and faces.
-
-\(fn)" t nil)
-
-(autoload 'helm-manage-advice "helm-elisp" "\
-Preconfigured `helm' to disable/enable function advices.
-
-\(fn)" t nil)
-
-(autoload 'helm-locate-library "helm-elisp" "\
-Preconfigured helm to locate elisp libraries.
-
-\(fn)" t nil)
-
-(autoload 'helm-timers "helm-elisp" "\
-Preconfigured `helm' for timers.
-
-\(fn)" t nil)
-
-(autoload 'helm-complex-command-history "helm-elisp" "\
-Preconfigured helm for complex command history.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-elisp-package" "helm-elisp-package.el"
-;;;;;; (22156 56359 0 0))
-;;; Generated autoloads from helm-elisp-package.el
-
-(autoload 'helm-list-elisp-packages "helm-elisp-package" "\
-Preconfigured helm for listing and handling emacs packages.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-list-elisp-packages-no-fetch "helm-elisp-package" "\
-Preconfigured helm for emacs packages.
-Same as `helm-list-elisp-packages' but don't fetch packages on remote.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-elscreen" "helm-elscreen.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-elscreen.el
-
-(autoload 'helm-elscreen "helm-elscreen" "\
-Preconfigured helm to list elscreen.
-
-\(fn)" t nil)
-
-(autoload 'helm-elscreen-history "helm-elscreen" "\
-Preconfigured helm to list elscreen in history order.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-eshell" "helm-eshell.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-eshell.el
-
-(autoload 'helm-esh-pcomplete "helm-eshell" "\
-Preconfigured helm to provide helm completion in eshell.
-
-\(fn)" t nil)
-
-(autoload 'helm-eshell-history "helm-eshell" "\
-Preconfigured helm for eshell history.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-eval" "helm-eval.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-eval.el
-
-(autoload 'helm-eval-expression "helm-eval" "\
-Preconfigured helm for `helm-source-evaluation-result'.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-eval-expression-with-eldoc "helm-eval" "\
-Preconfigured helm for `helm-source-evaluation-result' with `eldoc' support.
-
-\(fn)" t nil)
-
-(autoload 'helm-calcul-expression "helm-eval" "\
-Preconfigured helm for `helm-source-calculation-result'.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-external" "helm-external.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-external.el
-
-(autoload 'helm-run-external-command "helm-external" "\
-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'.
-
-\(fn PROGRAM)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-files" "helm-files.el" (22156 56359 0
-;;;;;; 0))
-;;; Generated autoloads from helm-files.el
-
-(autoload 'helm-browse-project "helm-files" "\
-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>
-and
-<http://melpa.org/#/helm-ls-svn>.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-find "helm-files" "\
-Preconfigured `helm' for the find shell command.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-find-files "helm-files" "\
-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.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-for-files "helm-files" "\
-Preconfigured `helm' for opening files.
-Run all sources defined in `helm-for-files-preferred-list'.
-
-\(fn)" t nil)
-
-(autoload 'helm-multi-files "helm-files" "\
-Preconfigured helm similar to `helm-for-files' but that don't run locate.
-Allow toggling from locate to others sources.
-This allow seeing first if what you search is in other sources before launching
-locate.
-
-\(fn)" t nil)
-
-(autoload 'helm-recentf "helm-files" "\
-Preconfigured `helm' for `recentf'.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-font" "helm-font.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-font.el
-
-(autoload 'helm-select-xfont "helm-font" "\
-Preconfigured `helm' to select Xfont.
-
-\(fn)" t nil)
-
-(autoload 'helm-ucs "helm-font" "\
-Preconfigured helm for `ucs-names' math symbols.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-grep" "helm-grep.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-grep.el
-
-(autoload 'helm-goto-precedent-file "helm-grep" "\
-Go to precedent file in helm grep/etags buffers.
-
-\(fn)" t nil)
-
-(autoload 'helm-goto-next-file "helm-grep" "\
-Go to precedent file in helm grep/etags buffers.
-
-\(fn)" t nil)
-
-(autoload 'helm-grep-mode "helm-grep" "\
-Major mode to provide actions in helm grep saved buffer.
-
-Special commands:
-\\{helm-grep-mode-map}
-
-\(fn)" t nil)
-
-(autoload 'helm-do-grep-ag "helm-grep" "\
-Preconfigured helm for grepping with AG in `default-directory'.
-
-\(fn)" t nil)
-
-(autoload 'helm-grep-do-git-grep "helm-grep" "\
-Preconfigured helm for git-grepping `default-directory'.
-With a prefix arg ARG git-grep the whole repository.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-help" "helm-help.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-help.el
-
-(autoload 'helm-documentation "helm-help" "\
-Preconfigured helm for helm documentation.
-With a prefix arg refresh the documentation.
-
-Find here the documentation of all sources actually documented.
-
-\(fn ARG)" t nil)
-
-(defvar helm-comp-read-mode-line "\\<helm-comp-read-map>C/\\[helm-cr-empty-string]:Empty \\<helm-map>\\[helm-help]:Help \\[helm-select-action]:Act \\[helm-maybe-exit-minibuffer]/f1/f2/f-n:NthAct \\[helm-toggle-suspend-update]:Tog.suspend")
-
-(defvar helm-read-file-name-mode-line-string "\\<helm-read-file-map>\\[helm-help]:Help C/\\[helm-cr-empty-string]:Empty \\<helm-map>\\[helm-select-action]:Act \\[helm-maybe-exit-minibuffer]/f1/f2/f-n:NthAct \\[helm-toggle-suspend-update]:Tog.suspend" "\
-String displayed in mode-line in `helm-source-find-files'.")
-
-(defvar helm-top-mode-line "\\<helm-top-map>\\[helm-help]:Help \\<helm-map>\\[helm-select-action]:Act \\[helm-maybe-exit-minibuffer]/f1/f2/f-n:NthAct \\[helm-toggle-suspend-update]:Tog.suspend")
-
-(autoload 'helm-describe-helm-attribute "helm-help" "\
-Display the full documentation of HELM-ATTRIBUTE.
-HELM-ATTRIBUTE should be a symbol.
-
-\(fn HELM-ATTRIBUTE)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-id-utils" "helm-id-utils.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-id-utils.el
-
-(autoload 'helm-gid "helm-id-utils" "\
-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/>.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-imenu" "helm-imenu.el" (22156 56359 0
-;;;;;; 0))
-;;; Generated autoloads from helm-imenu.el
-
-(autoload 'helm-imenu "helm-imenu" "\
-Preconfigured `helm' for `imenu'.
-
-\(fn)" t nil)
-
-(autoload 'helm-imenu-in-all-buffers "helm-imenu" "\
-Preconfigured helm for fetching imenu entries of all buffers.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-info" "helm-info.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-info.el
-
-(autoload 'helm-info-at-point "helm-info" "\
-Preconfigured `helm' for searching info at point.
-With a prefix-arg insert symbol at point.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-locate" "helm-locate.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-locate.el
-
-(autoload 'helm-projects-find-files "helm-locate" "\
-Find files with locate in `helm-locate-project-list'.
-With a prefix arg refresh the database in each project.
-
-\(fn UPDATE)" t nil)
-
-(autoload 'helm-locate-read-file-name "helm-locate" "\
-
-
-\(fn PROMPT)" nil nil)
-
-(autoload 'helm-locate "helm-locate" "\
-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'.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-man" "helm-man.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-man.el
-
-(autoload 'helm-man-woman "helm-man" "\
-Preconfigured `helm' for Man and Woman pages.
-With a prefix arg reinitialize the cache.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-misc" "helm-misc.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-misc.el
-
-(autoload 'helm-browse-menubar "helm-misc" "\
-Preconfigured helm to the menubar using lacarte.el.
-
-\(fn)" t nil)
-
-(autoload 'helm-world-time "helm-misc" "\
-Preconfigured `helm' to show world time.
-Default action change TZ environment variable locally to emacs.
-
-\(fn)" t nil)
-
-(autoload 'helm-insert-latex-math "helm-misc" "\
-Preconfigured helm for latex math symbols completion.
-
-\(fn)" t nil)
-
-(autoload 'helm-ratpoison-commands "helm-misc" "\
-Preconfigured `helm' to execute ratpoison commands.
-
-\(fn)" t nil)
-
-(autoload 'helm-stumpwm-commands "helm-misc" "\
-Preconfigured helm for stumpwm commands.
-
-\(fn)" t nil)
-
-(autoload 'helm-minibuffer-history "helm-misc" "\
-Preconfigured `helm' for `minibuffer-history'.
-
-\(fn)" t nil)
-
-(autoload 'helm-comint-input-ring "helm-misc" "\
-Preconfigured `helm' that provide completion of `comint' history.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-mode" "helm-mode.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-mode.el
-
-(autoload 'helm-comp-read "helm-mode" "\
-Read a string in the minibuffer, with helm completion.
-
-It is helm `completing-read' equivalent.
-
-- PROMPT is the prompt name to use.
-
-- COLLECTION can be a list, vector, obarray or hash-table.
- It can be also a function that receives three arguments:
- the values string, predicate and t. See `all-completions' for more details.
-
-Keys description:
-
-- TEST: A predicate called with one arg i.e candidate.
-
-- INITIAL-INPUT: Same as input arg in `helm'.
-
-- PRESELECT: See preselect arg of `helm'.
-
-- DEFAULT: This option is used only for compatibility with regular
- Emacs `completing-read' (Same as DEFAULT arg of `completing-read').
-
-- BUFFER: Name of helm-buffer.
-
-- MUST-MATCH: Candidate selected must be one of COLLECTION.
-
-- FUZZY: Enable fuzzy matching.
-
-- REVERSE-HISTORY: When non--nil display history source after current
- source completion.
-
-- REQUIRES-PATTERN: Same as helm attribute, default is 0.
-
-- HISTORY: A list containing specific history, default is nil.
- When it is non--nil, all elements of HISTORY are displayed in
- a special source before COLLECTION.
-
-- INPUT-HISTORY: A symbol. the minibuffer input history will be
- stored there, if nil or not provided, `minibuffer-history'
- will be used instead.
-
-- CASE-FOLD: Same as `helm-case-fold-search'.
-
-- DEL-INPUT: Boolean, when non--nil (default) remove the partial
- minibuffer input from HISTORY is present.
-
-- PERSISTENT-ACTION: A function called with one arg i.e candidate.
-
-- PERSISTENT-HELP: A string to document PERSISTENT-ACTION.
-
-- MODE-LINE: A string or list to display in mode line.
- Default is `helm-comp-read-mode-line'.
-
-- KEYMAP: A keymap to use in this `helm-comp-read'.
- (the keymap will be shared with history source)
-
-- NAME: The name related to this local source.
-
-- EXEC-WHEN-ONLY-ONE: Bound `helm-execute-action-at-once-if-one'
- to non--nil. (possibles values are t or nil).
-
-- VOLATILE: Use volatile attribute (enabled by default).
-
-- SORT: A predicate to give to `sort' e.g `string-lessp'
- Use this only on small data as it is ineficient.
- If you want to sort faster add a sort function to
- FC-TRANSFORMER.
- Note that FUZZY when enabled is already providing a sort function.
-
-- FC-TRANSFORMER: A `filtered-candidate-transformer' function
- or a list of functions.
-
-- HIST-FC-TRANSFORMER: A `filtered-candidate-transformer'
- function for the history source.
-
-- MARKED-CANDIDATES: If non--nil return candidate or marked candidates as a list.
-
-- NOMARK: When non--nil don't allow marking candidates.
-
-- ALISTP: (default is non--nil) 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.
- Argument VOLATILE have no effect when CANDIDATES-IN-BUFFER is non--nil.
-
-Any prefix args passed during `helm-comp-read' invocation will be recorded
-in `helm-current-prefix-arg', otherwise if prefix args were given before
-`helm-comp-read' invocation, the value of `current-prefix-arg' will be used.
-That's mean you can pass prefix args before or after calling a command
-that use `helm-comp-read' See `helm-M-x' for example.
-
-\(fn PROMPT COLLECTION &key TEST INITIAL-INPUT DEFAULT PRESELECT (buffer \"*Helm Completions*\") MUST-MATCH FUZZY REVERSE-HISTORY (requires-pattern 0) HISTORY INPUT-HISTORY (case-fold helm-comp-read-case-fold-search) (del-input t) (persistent-action nil) (persistent-help \"DoNothing\") (mode-line helm-comp-read-mode-line) HELP-MESSAGE (keymap helm-comp-read-map) (name \"Helm Completions\") CANDIDATES-IN-BUFFER EXEC-WHEN-ONLY-ONE QUIT-WHEN-NO-CAND (volatile t) SORT (fc-transformer (quote helm-cr-default-transformer)) HIST-FC-TRANSFORMER MARKED-CANDIDATES NOMARK (alistp t) (candidate-number-limit helm-candidate-number-limit))" nil nil)
-
-(autoload 'helm-read-file-name "helm-mode" "\
-Read a file name with helm completion.
-It is helm `read-file-name' emulation.
-
-Argument PROMPT is the default prompt to use.
-
-Keys description:
-
-- NAME: Source name, default to \"Read File Name\".
-
-- INITIAL-INPUT: Where to start read file name, default to `default-directory'.
-
-- BUFFER: `helm-buffer' name default to \"*Helm Completions*\".
-
-- TEST: A predicate called with one arg 'candidate'.
-
-- CASE-FOLD: Same as `helm-case-fold-search'.
-
-- PRESELECT: helm preselection.
-
-- HISTORY: Display HISTORY in a special source.
-
-- MUST-MATCH: Can be 'confirm, nil, or t.
-
-- MARKED-CANDIDATES: When non--nil return a list of marked candidates.
-
-- NOMARK: When non--nil don't allow marking candidates.
-
-- ALISTP: Don't use `all-completions' in history (take effect only on history).
-
-- PERSISTENT-ACTION: a persistent action function.
-
-- PERSISTENT-HELP: persistent help message.
-
-- MODE-LINE: A mode line message, default is `helm-read-file-name-mode-line-string'.
-
-\(fn PROMPT &key (name \"Read File Name\") (initial-input default-directory) (buffer \"*Helm file completions*\") TEST (case-fold helm-file-name-case-fold-search) PRESELECT HISTORY MUST-MATCH DEFAULT MARKED-CANDIDATES (candidate-number-limit helm-ff-candidate-number-limit) NOMARK (alistp t) (persistent-action (quote helm-find-files-persistent-action)) (persistent-help \"Hit1 Expand Candidate, Hit2 or (C-u) Find file\") (mode-line helm-read-file-name-mode-line-string))" nil nil)
-
-(defvar helm-mode nil "\
-Non-nil if Helm mode is enabled.
-See the command `helm-mode' for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `helm-mode'.")
-
-(custom-autoload 'helm-mode "helm-mode" nil)
-
-(autoload 'helm-mode "helm-mode" "\
-Toggle generic helm completion.
-
-All functions in Emacs that use `completing-read'
-or `read-file-name' 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 turn it on with `helm-mode'.
-
-Some crap emacs functions may not be supported,
-e.g `ffap-alternate-file' and maybe others
-You can add such functions to `helm-completing-read-handlers-alist'
-with a nil value.
-
-Note: This mode is incompatible with Emacs23.
-
-\(fn &optional ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-net" "helm-net.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-net.el
-
-(autoload 'helm-surfraw "helm-net" "\
-Preconfigured `helm' to search PATTERN with search ENGINE.
-
-\(fn PATTERN ENGINE)" t nil)
-
-(autoload 'helm-google-suggest "helm-net" "\
-Preconfigured `helm' for google search with google suggest.
-
-\(fn)" t nil)
-
-(autoload 'helm-wikipedia-suggest "helm-net" "\
-Preconfigured `helm' for Wikipedia lookup with Wikipedia suggest.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-org" "helm-org.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-org.el
-
-(autoload 'helm-org-agenda-files-headings "helm-org" "\
-Preconfigured helm for org files headings.
-
-\(fn)" t nil)
-
-(autoload 'helm-org-in-buffer-headings "helm-org" "\
-Preconfigured helm for org buffer headings.
-
-\(fn)" t nil)
-
-(autoload 'helm-org-parent-headings "helm-org" "\
-Preconfigured helm for org headings that are parents of the
-current heading.
-
-\(fn)" t nil)
-
-(autoload 'helm-org-capture-templates "helm-org" "\
-Preconfigured helm for org templates.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-regexp" "helm-regexp.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-regexp.el
-
-(autoload 'helm-moccur-mode "helm-regexp" "\
-Major mode to provide actions in helm moccur saved buffer.
-
-Special commands:
-\\{helm-moccur-mode-map}
-
-\(fn)" t nil)
-
-(autoload 'helm-regexp "helm-regexp" "\
-Preconfigured helm to build regexps.
-`query-replace-regexp' can be run from there against found regexp.
-
-\(fn)" t nil)
-
-(autoload 'helm-occur "helm-regexp" "\
-Preconfigured helm for Occur.
-
-\(fn)" t nil)
-
-(autoload 'helm-occur-from-isearch "helm-regexp" "\
-Invoke `helm-occur' from isearch.
-
-\(fn)" t nil)
-
-(autoload 'helm-multi-occur-from-isearch "helm-regexp" "\
-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.
-
-\(fn &optional ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-ring" "helm-ring.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-ring.el
-
-(defvar helm-push-mark-mode nil "\
-Non-nil if Helm-Push-Mark mode is enabled.
-See the command `helm-push-mark-mode' for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `helm-push-mark-mode'.")
-
-(custom-autoload 'helm-push-mark-mode "helm-ring" nil)
-
-(autoload 'helm-push-mark-mode "helm-ring" "\
-Provide an improved version of `push-mark'.
-Modify the behavior of `push-mark' to update
-the `global-mark-ring' after each new visit.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'helm-mark-ring "helm-ring" "\
-Preconfigured `helm' for `helm-source-mark-ring'.
-
-\(fn)" t nil)
-
-(autoload 'helm-global-mark-ring "helm-ring" "\
-Preconfigured `helm' for `helm-source-global-mark-ring'.
-
-\(fn)" t nil)
-
-(autoload 'helm-all-mark-rings "helm-ring" "\
-Preconfigured `helm' for `helm-source-global-mark-ring' and `helm-source-mark-ring'.
-
-\(fn)" t nil)
-
-(autoload 'helm-register "helm-ring" "\
-Preconfigured `helm' for Emacs registers.
-
-\(fn)" t nil)
-
-(autoload 'helm-show-kill-ring "helm-ring" "\
-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.
-
-\(fn)" t nil)
-
-(autoload 'helm-execute-kmacro "helm-ring" "\
-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.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-semantic" "helm-semantic.el" (22156 56359
-;;;;;; 0 0))
-;;; Generated autoloads from helm-semantic.el
-
-(autoload 'helm-semantic "helm-semantic" "\
-Preconfigured `helm' for `semantic'.
-If ARG is supplied, pre-select symbol at point instead of current
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-semantic-or-imenu "helm-semantic" "\
-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.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-sys" "helm-sys.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-sys.el
-
-(autoload 'helm-top "helm-sys" "\
-Preconfigured `helm' for top command.
-
-\(fn)" t nil)
-
-(autoload 'helm-list-emacs-process "helm-sys" "\
-Preconfigured `helm' for emacs process.
-
-\(fn)" t nil)
-
-(autoload 'helm-xrandr-set "helm-sys" "\
-Preconfigured helm for xrandr.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-tags" "helm-tags.el" (22156 56359 0 0))
-;;; Generated autoloads from helm-tags.el
-
-(autoload 'helm-etags-select "helm-tags" "\
-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.
-
-\(fn REINIT)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-utils" "helm-utils.el" (22156 56359 0
-;;;;;; 0))
-;;; Generated autoloads from helm-utils.el
-
-(autoload 'helm-show-all-in-this-source-only "helm-utils" "\
-Show only current source of this helm session with all its candidates.
-With a numeric prefix arg show only the ARG number of candidates.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-display-all-sources "helm-utils" "\
-Display all sources previously hidden by `helm-set-source-filter'.
-
-\(fn)" t nil)
-
-(autoload 'helm-quit-and-find-file "helm-utils" "\
-Drop into `helm-find-files' from `helm'.
-If current selection is a buffer or a file, `helm-find-files'
-from its directory.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil nil ("helm-easymenu.el" "helm-multi-match.el"
-;;;;;; "helm-pkg.el" "helm-plugin.el" "helm-types.el") (22156 56359
-;;;;;; 459434 0))
-
-;;;***
-\f
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; End:
-;;; helm-autoloads.el ends here
+++ /dev/null
-;;; helm-bookmark.el --- Helm for Emacs regular Bookmarks. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'bookmark)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-types)
-(require 'helm-utils)
-(require 'helm-info)
-(require 'helm-adaptive)
-(require 'helm-net)
-
-(declare-function addressbook-bookmark-edit "ext:addressbook-bookmark.el" (bookmark))
-(declare-function message-buffers "message.el")
-(declare-function addressbook-set-mail-buffer-1 "ext:addressbook-bookmark.el"
- (&optional bookmark-name append cc))
-
-\f
-(defgroup helm-bookmark nil
- "Predefined configurations for `helm.el'."
- :group 'helm)
-
-(defcustom helm-bookmark-show-location nil
- "Show location of bookmark on display."
- :group 'helm-bookmark
- :type 'boolean)
-
-(defcustom helm-bookmark-default-filtered-sources
- (append '(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)
- (and (locate-library "addressbook-bookmark")
- (list 'helm-source-bookmark-addressbook))
- (list 'helm-source-bookmark-uncategorized
- 'helm-source-bookmark-set))
- "List of sources to use in `helm-filtered-bookmarks'."
- :group 'helm-bookmark
- :type '(repeat (choice symbol)))
-
-(defcustom helm-bookmark-addressbook-actions
- '(("Show Contact(s)"
- . (lambda (candidate)
- (let* ((contacts (helm-marked-candidates))
- (current-prefix-arg helm-current-prefix-arg))
- (bookmark-jump
- (helm-bookmark-get-bookmark-from-name (car contacts)))
- (helm-aif (cdr contacts)
- (let ((current-prefix-arg '(4)))
- (cl-loop for bmk in it do
- (bookmark-jump
- (helm-bookmark-get-bookmark-from-name bmk))))))))
- ("Mail To" . helm-bookmark-addressbook-send-mail-1)
- ("Mail Cc" . (lambda (_candidate)
- (helm-bookmark-addressbook-send-mail-1 nil 'cc)))
- ("Mail Bcc" . (lambda (_candidate)
- (helm-bookmark-addressbook-send-mail-1 nil 'bcc)))
- ("Edit Bookmark"
- . (lambda (candidate)
- (let ((bmk (helm-bookmark-get-bookmark-from-name
- candidate)))
- (addressbook-bookmark-edit
- (assoc bmk bookmark-alist)))))
- ("Delete bookmark(s)" . helm-delete-marked-bookmarks)
- ("Insert Email at point"
- . (lambda (candidate)
- (let* ((bmk (helm-bookmark-get-bookmark-from-name
- candidate))
- (mlist (split-string
- (assoc-default
- 'email (assoc bmk bookmark-alist))
- ", ")))
- (insert
- (if (> (length mlist) 1)
- (helm-comp-read
- "Insert Mail Address: " mlist :must-match t)
- (car mlist))))))
- ("Show annotation"
- . (lambda (candidate)
- (let ((bmk (helm-bookmark-get-bookmark-from-name
- candidate)))
- (bookmark-show-annotation bmk))))
- ("Edit annotation"
- . (lambda (candidate)
- (let ((bmk (helm-bookmark-get-bookmark-from-name
- candidate)))
- (bookmark-edit-annotation bmk))))
- ("Show Google map"
- . (lambda (candidate)
- (let* ((bmk (helm-bookmark-get-bookmark-from-name
- candidate))
- (full-bmk (assoc bmk bookmark-alist)))
- (addressbook-google-map full-bmk)))))
- "Actions for addressbook bookmarks."
- :group 'helm-bookmark
- :type '(alist :key-type string :value-type function))
-
-\f
-(defface helm-bookmark-info
- '((t (:foreground "green")))
- "Face used for W3m Emacs bookmarks (not w3m bookmarks)."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-w3m
- '((t (:foreground "yellow")))
- "Face used for W3m Emacs bookmarks (not w3m bookmarks)."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-gnus
- '((t (:foreground "magenta")))
- "Face used for Gnus bookmarks."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-man
- '((t (:foreground "Orange4")))
- "Face used for Woman/man bookmarks."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-file
- '((t (:foreground "Deepskyblue2")))
- "Face used for file bookmarks."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-directory
- '((t (:inherit helm-ff-directory)))
- "Face used for file bookmarks."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-addressbook
- '((t (:foreground "tomato")))
- "Face used for addressbook bookmarks."
- :group 'helm-bookmark)
-
-\f
-(defvar helm-bookmark-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-c o") 'helm-bookmark-run-jump-other-window)
- (define-key map (kbd "C-d") 'helm-bookmark-run-delete)
- (define-key map (kbd "C-]") 'helm-bookmark-toggle-filename)
- (define-key map (kbd "M-e") 'helm-bookmark-run-edit)
- map)
- "Generic Keymap for emacs bookmark sources.")
-
-(defclass helm-source-basic-bookmarks (helm-source-in-buffer helm-type-bookmark)
- ((init :initform (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global
- (bookmark-all-names))))
- (filtered-candidate-transformer :initform 'helm-bookmark-transformer)
- (search :initform 'helm-bookmark-search-fn)))
-
-(defvar helm-source-bookmarks
- (helm-make-source "Bookmarks" 'helm-source-basic-bookmarks)
- "See (info \"(emacs)Bookmarks\").")
-
-(defun helm-bookmark-transformer (candidates _source)
- (cl-loop for i in candidates
- for loc = (bookmark-location i)
- for len = (string-width i)
- for trunc = (if (> len bookmark-bmenu-file-column)
- (helm-substring i bookmark-bmenu-file-column)
- i)
- for sep = (make-string (- (+ bookmark-bmenu-file-column 2)
- (length trunc))
- ? )
- if helm-bookmark-show-location
- collect (cons (concat trunc sep (if (listp loc) (car loc) loc)) i)
- else collect i))
-
-(defun helm-bookmark-toggle-filename-1 (_candidate)
- (let* ((real (helm-get-selection helm-buffer))
- (trunc (if (> (string-width real) bookmark-bmenu-file-column)
- (helm-substring real bookmark-bmenu-file-column)
- real))
- (loc (bookmark-location real)))
- (setq helm-bookmark-show-location (not helm-bookmark-show-location))
- (helm-force-update (if helm-bookmark-show-location
- (concat (regexp-quote trunc)
- " +"
- (regexp-quote
- (if (listp loc) (car loc) loc)))
- real))))
-
-(defun helm-bookmark-toggle-filename ()
- "Toggle bookmark location visibility."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'toggle-filename
- '(helm-bookmark-toggle-filename-1 . never-split))
- (helm-execute-persistent-action 'toggle-filename)))
-
-(defun helm-bookmark-jump (candidate)
- "Jump to bookmark from keyboard."
- (let ((current-prefix-arg helm-current-prefix-arg)
- non-essential)
- (bookmark-jump candidate)))
-
-(defun helm-bookmark-jump-other-window (candidate)
- (let (non-essential)
- (bookmark-jump-other-window candidate)))
-
-\f
-;;; bookmark-set
-;;
-(defvar helm-source-bookmark-set
- (helm-build-dummy-source "Set Bookmark"
- :filtered-candidate-transformer
- (lambda (_candidates _source)
- (list (or (and (not (string= helm-pattern ""))
- helm-pattern)
- "Enter a bookmark name to record")))
- :action '(("Set bookmark" . (lambda (candidate)
- (if (string= helm-pattern "")
- (message "No bookmark name given for record")
- (bookmark-set candidate))))))
- "See (info \"(emacs)Bookmarks\").")
-
-\f
-;;; Search and match-part fns.
-;;
-(defun helm-bookmark-search-fn (pattern)
- "Search function for bookmark sources using `helm-source-in-buffer'."
- (if helm-bookmark-show-location
- (helm-aif (next-single-property-change (point) 'location)
- (goto-char it))
- (re-search-forward pattern nil t)))
-
-(defun helm-bookmark-match-part-fn (candidate)
- "Match part function for bookmark sources using `helm-source-in-buffer'."
- (helm-aif (and helm-bookmark-show-location
- (bookmark-location candidate))
- ;; Match against bookmark-name and location.
- (concat candidate " " it)
- ;; Match against bookmark-name.
- candidate))
-
-\f
-;;; Predicates
-;;
-(defconst helm-bookmark--non-file-filename " - no file -"
- "Name to use for `filename' entry, for non-file bookmarks.")
-
-(defun helm-bookmark-gnus-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a Gnus bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-gnus)
- (eq (bookmark-get-handler bookmark) 'gnus-summary-bookmark-jump)
- (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-gnus)))
-
-(defun helm-bookmark-w3m-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a W3m bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-w3m)
- (eq (bookmark-get-handler bookmark) 'bookmark-w3m-bookmark-jump)
- (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-w3m)))
-
-(defun helm-bookmark-woman-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a Woman bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-woman)
- (eq (bookmark-get-handler bookmark) 'woman-bookmark-jump)
- (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-woman)))
-
-(defun helm-bookmark-man-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a Man bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-man)
- (eq (bookmark-get-handler bookmark) 'Man-bookmark-jump)
- (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-man)))
-
-(defun helm-bookmark-woman-man-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a Man or Woman bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (helm-bookmark-man-bookmark-p bookmark)
- (helm-bookmark-woman-bookmark-p bookmark)))
-
-(defun helm-bookmark-info-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is an Info bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (eq (bookmark-get-handler bookmark) 'Info-bookmark-jump))
-
-(defun helm-bookmark-image-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK bookmarks an image file."
- (if (stringp bookmark)
- (assoc 'image-type (assoc bookmark bookmark-alist))
- (assoc 'image-type bookmark)))
-
-(defun helm-bookmark-file-p (bookmark)
- "Return non-nil if BOOKMARK bookmarks a file or directory.
-BOOKMARK is a bookmark name or a bookmark record.
-This excludes bookmarks of a more specific kind (Info, Gnus, and W3m)."
- (let* ((filename (bookmark-get-filename bookmark))
- (isnonfile (equal filename helm-bookmark--non-file-filename)))
- (and filename (not isnonfile) (not (bookmark-get-handler bookmark)))))
-
-(defun helm-bookmark-helm-find-files-p (bookmark)
- "Return non-nil if BOOKMARK bookmarks a `helm-find-files' session.
-BOOKMARK is a bookmark name or a bookmark record."
- (eq (bookmark-get-handler bookmark) 'helm-ff-bookmark-jump))
-
-(defun helm-bookmark-addressbook-p (bookmark)
- "Return non--nil if BOOKMARK is a contact recorded with addressbook-bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (if (listp bookmark)
- (string= (assoc-default 'type bookmark) "addressbook")
- (string= (assoc-default
- 'type (assoc bookmark bookmark-alist)) "addressbook")))
-
-(defun helm-bookmark-uncategorized-bookmark-p (bookmark)
- "Return non--nil if BOOKMARK match no known category."
- (cl-loop for pred in '(helm-bookmark-addressbook-p
- helm-bookmark-gnus-bookmark-p
- helm-bookmark-w3m-bookmark-p
- helm-bookmark-woman-man-bookmark-p
- helm-bookmark-info-bookmark-p
- helm-bookmark-image-bookmark-p
- helm-bookmark-file-p
- helm-bookmark-helm-find-files-p
- helm-bookmark-addressbook-p)
- never (funcall pred bookmark)))
-
-(defun helm-bookmark-filter-setup-alist (fn)
- "Return a filtered `bookmark-alist' sorted alphabetically."
- (cl-loop for b in bookmark-alist
- for name = (car b)
- when (funcall fn b) collect
- (propertize name 'location (bookmark-location name))))
-\f
-;;; Bookmark handlers
-;;
-(defvar w3m-async-exec)
-(defun helm-bookmark-jump-w3m (bookmark)
- "Jump to W3m bookmark BOOKMARK, setting a new tab.
-If `browse-url-browser-function' is set to something else
-than `w3m-browse-url' use it."
- (require 'helm-net)
- (let ((file (or (bookmark-prop-get bookmark 'filename)
- (bookmark-prop-get bookmark 'url)))
- (buf (generate-new-buffer-name "*w3m*"))
- (w3m-async-exec nil)
- (really-use-w3m (equal browse-url-browser-function 'w3m-browse-url)))
- (helm-browse-url file really-use-w3m)
- (when really-use-w3m
- (bookmark-default-handler
- `("" (buffer . ,buf) . ,(bookmark-get-bookmark-record bookmark))))))
-
-;; All bookmarks recorded with the handler provided with w3m
-;; (`bookmark-w3m-bookmark-jump') will use our handler which open
-;; the bookmark in a new tab or in an external browser depending
-;; on `browse-url-browser-function'.
-(defalias 'bookmark-w3m-bookmark-jump 'helm-bookmark-jump-w3m)
-
-;; Provide compatibility with old handlers provided in external
-;; packages bookmark-extensions.el and bookmark+.
-(defalias 'bmkext-jump-woman 'woman-bookmark-jump)
-(defalias 'bmkext-jump-man 'Man-bookmark-jump)
-(defalias 'bmkext-jump-w3m 'helm-bookmark-jump-w3m)
-(defalias 'bmkext-jump-gnus 'gnus-summary-bookmark-jump)
-(defalias 'bookmarkp-jump-gnus 'gnus-summary-bookmark-jump)
-(defalias 'bookmarkp-jump-w3m 'helm-bookmark-jump-w3m)
-(defalias 'bookmarkp-jump-woman 'woman-bookmark-jump)
-(defalias 'bookmarkp-jump-man 'Man-bookmark-jump)
-
-\f
-;;;; Filtered bookmark sources
-;;
-;;
-(defclass helm-source-filtered-bookmarks (helm-source-in-buffer helm-type-bookmark)
- ((search :initform #'helm-bookmark-search-fn)
- (match-part :initform #'helm-bookmark-match-part-fn)
- (filtered-candidate-transformer
- :initform '(helm-adaptive-sort
- helm-highlight-bookmark))))
-
-;;; W3m bookmarks.
-;;
-(defun helm-bookmark-w3m-setup-alist ()
- "Specialized filter function for bookmarks w3m."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-w3m-bookmark-p))
-
-(defvar helm-source-bookmark-w3m
- (helm-make-source "Bookmark W3m" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-w3m-setup-alist)))))
-
-;;; Images
-;;
-(defun helm-bookmark-images-setup-alist ()
- "Specialized filter function for images bookmarks."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-image-bookmark-p))
-
-(defvar helm-source-bookmark-images
- (helm-make-source "Bookmark Images" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-images-setup-alist)))))
-
-;;; Woman Man
-;;
-(defun helm-bookmark-man-setup-alist ()
- "Specialized filter function for bookmarks w3m."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-woman-man-bookmark-p))
-
-(defvar helm-source-bookmark-man
- (helm-make-source "Bookmark Woman&Man" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-man-setup-alist)))))
-
-;;; Gnus
-;;
-(defun helm-bookmark-gnus-setup-alist ()
- "Specialized filter function for bookmarks gnus."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-gnus-bookmark-p))
-
-(defvar helm-source-bookmark-gnus
- (helm-make-source "Bookmark Gnus" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-gnus-setup-alist)))))
-
-;;; Info
-;;
-(defun helm-bookmark-info-setup-alist ()
- "Specialized filter function for bookmarks info."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-info-bookmark-p))
-
-(defvar helm-source-bookmark-info
- (helm-make-source "Bookmark Info" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-info-setup-alist)))))
-
-;;; Files and directories
-;;
-(defun helm-bookmark-local-files-setup-alist ()
- "Specialized filter function for bookmarks locals files."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-file-p))
-
-(defvar helm-source-bookmark-files&dirs
- (helm-make-source "Bookmark Files&Directories" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-local-files-setup-alist)))))
-
-;;; Helm find files sessions.
-;;
-(defun helm-bookmark-helm-find-files-setup-alist ()
- "Specialized filter function for `helm-find-files' bookmarks."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-helm-find-files-p))
-
-(defvar helm-source-bookmark-helm-find-files
- (helm-make-source "Bookmark helm-find-files sessions" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-helm-find-files-setup-alist)))
- :persistent-action (lambda (_candidate) (ignore))
- :persistent-help "Do nothing"))
-
-;;; Uncategorized bookmarks
-;;
-(defun helm-bookmark-uncategorized-setup-alist ()
- "Specialized filter function for uncategorized bookmarks."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-uncategorized-bookmark-p))
-
-(defvar helm-source-bookmark-uncategorized
- (helm-make-source "Bookmark uncategorized" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-uncategorized-setup-alist)))))
-
-;;; Addressbook.
-;;
-;;
-(defclass helm-bookmark-addressbook-class (helm-source-in-buffer)
- ((init :initform (lambda ()
- (require 'addressbook-bookmark nil t)
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global
- (helm-bookmark-addressbook-setup-alist))))
- (search :initform #'helm-bookmark-search-fn)
- (match-part :initform #'helm-bookmark-match-part-fn)
- (persistent-action :initform
- (lambda (candidate)
- (let ((bmk (helm-bookmark-get-bookmark-from-name
- candidate)))
- (bookmark--jump-via bmk 'switch-to-buffer))))
- (persistent-help :initform "Show contact - Prefix with C-u to append")
- (filtered-candidate-transformer :initform
- '(helm-adaptive-sort
- helm-highlight-bookmark))
- (action :initform 'helm-bookmark-addressbook-actions)))
-
-(defun helm-bookmark-addressbook-send-mail-1 (_candidate &optional cc)
- (let* ((contacts (helm-marked-candidates))
- (bookmark (helm-bookmark-get-bookmark-from-name
- (car contacts)))
- (append (message-buffers)))
- (addressbook-set-mail-buffer-1 bookmark append)
- (helm-aif (cdr contacts)
- (progn
- (when cc (addressbook-set-mail-buffer-1 (car it) nil cc))
- (cl-loop for bmk in (cdr it) do
- (addressbook-set-mail-buffer-1
- (helm-bookmark-get-bookmark-from-name bmk) 'append cc))))))
-
-(defun helm-bookmark-addressbook-setup-alist ()
- "Specialized filter function for addressbook bookmarks."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-addressbook-p))
-
-(defvar helm-source-bookmark-addressbook
- (helm-make-source "Bookmark Addressbook" 'helm-bookmark-addressbook-class))
-
-;;; Transformer
-;;
-\f
-(defun helm-highlight-bookmark (bookmarks _source)
- "Used as `filtered-candidate-transformer' to colorize bookmarks.
-Work both with standard Emacs bookmarks and bookmark-extensions.el."
- (let ((non-essential t))
- (cl-loop for i in bookmarks
- for isfile = (bookmark-get-filename i)
- for hff = (helm-bookmark-helm-find-files-p i)
- for handlerp = (and (fboundp 'bookmark-get-handler)
- (bookmark-get-handler i))
- for isw3m = (and (fboundp 'helm-bookmark-w3m-bookmark-p)
- (helm-bookmark-w3m-bookmark-p i))
- for isgnus = (and (fboundp 'helm-bookmark-gnus-bookmark-p)
- (helm-bookmark-gnus-bookmark-p i))
- for isman = (and (fboundp 'helm-bookmark-man-bookmark-p) ; Man
- (helm-bookmark-man-bookmark-p i))
- for iswoman = (and (fboundp 'helm-bookmark-woman-bookmark-p) ; Woman
- (helm-bookmark-woman-bookmark-p i))
- for isannotation = (bookmark-get-annotation i)
- for isabook = (string= (bookmark-prop-get i 'type)
- "addressbook")
- for isinfo = (eq handlerp 'Info-bookmark-jump)
- for loc = (bookmark-location i)
- for len = (string-width i)
- for trunc = (if (and helm-bookmark-show-location
- (> len bookmark-bmenu-file-column))
- (helm-substring
- i bookmark-bmenu-file-column)
- i)
- ;; Add a * if bookmark have annotation
- if (and isannotation (not (string-equal isannotation "")))
- do (setq trunc (concat "*" (if helm-bookmark-show-location trunc i)))
- for sep = (and helm-bookmark-show-location
- (make-string (- (+ bookmark-bmenu-file-column 2)
- (string-width trunc))
- ? ))
- for bmk = (cond ( ;; info buffers
- isinfo
- (propertize trunc 'face 'helm-bookmark-info
- 'help-echo isfile))
- ( ;; w3m buffers
- isw3m
- (propertize trunc 'face 'helm-bookmark-w3m
- 'help-echo isfile))
- ( ;; gnus buffers
- isgnus
- (propertize trunc 'face 'helm-bookmark-gnus
- 'help-echo isfile))
- ( ;; Man Woman
- (or iswoman isman)
- (propertize trunc 'face 'helm-bookmark-man
- 'help-echo isfile))
- ( ;; Addressbook
- isabook
- (propertize trunc 'face 'helm-bookmark-addressbook))
- ( ;; directories
- (and isfile
- (or hff
- ;; This is needed because `non-essential'
- ;; is not working on Emacs-24.2 and the behavior
- ;; of tramp seems to have changed since previous
- ;; versions (Need to reenter password even if a
- ;; first connection have been established,
- ;; probably when host is named differently
- ;; i.e machine/localhost)
- (and (not (file-remote-p isfile))
- (file-directory-p isfile))))
- (propertize trunc 'face 'helm-bookmark-directory
- 'help-echo isfile))
- ( ;; regular files
- t
- (propertize trunc 'face 'helm-bookmark-file
- 'help-echo isfile)))
- collect (if helm-bookmark-show-location
- (cons (concat bmk sep (if (listp loc) (car loc) loc))
- i)
- (cons bmk i)))))
-
-\f
-;;; Edit/rename/save bookmarks.
-;;
-;;
-(defun helm-bookmark-edit-bookmark (bookmark-name)
- "Edit bookmark's name and file name, and maybe save them.
-BOOKMARK-NAME is the current (old) name of the bookmark to be renamed."
- (let ((bmk (helm-bookmark-get-bookmark-from-name bookmark-name))
- (handler (bookmark-prop-get bookmark-name 'handler)))
- (if (eq handler 'addressbook-bookmark-jump)
- (addressbook-bookmark-edit
- (assoc bmk bookmark-alist))
- (helm-bookmark-edit-bookmark-1 bookmark-name handler))))
-
-(defun helm-bookmark-edit-bookmark-1 (bookmark-name handler)
- (let* ((helm--reading-passwd-or-string t)
- (bookmark-fname (bookmark-get-filename bookmark-name))
- (bookmark-loc (bookmark-prop-get bookmark-name 'location))
- (new-name (read-from-minibuffer "Name: " bookmark-name))
- (new-loc (read-from-minibuffer "FileName or Location: "
- (or bookmark-fname
- (if (consp bookmark-loc)
- (car bookmark-loc)
- bookmark-loc))))
- (docid (and (eq handler 'mu4e-bookmark-jump)
- (read-number "Docid: " (cdr bookmark-loc)))))
- (when docid
- (setq new-loc (cons new-loc docid)))
- (when (and (not (equal new-name "")) (not (equal new-loc ""))
- (y-or-n-p "Save changes? "))
- (if bookmark-fname
- (progn
- (helm-bookmark-rename bookmark-name new-name 'batch)
- (bookmark-set-filename new-name new-loc))
- (bookmark-prop-set
- (bookmark-get-bookmark bookmark-name) 'location new-loc)
- (helm-bookmark-rename bookmark-name new-name 'batch))
- (helm-bookmark-maybe-save-bookmark)
- (list new-name new-loc))))
-
-(defun helm-bookmark-maybe-save-bookmark ()
- "Increment save counter and maybe save `bookmark-alist'."
- (setq bookmark-alist-modification-count (1+ bookmark-alist-modification-count))
- (when (bookmark-time-to-save-p) (bookmark-save)))
-
-(defun 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."
- (interactive (list (bookmark-completing-read "Old bookmark name")))
- (bookmark-maybe-historicize-string old)
- (bookmark-maybe-load-default-file)
- (save-excursion (skip-chars-forward " ") (setq bookmark-yank-point (point)))
- (setq bookmark-current-buffer (current-buffer))
- (let ((newname (or new (read-from-minibuffer
- "New name: " nil
- (let ((now-map (copy-keymap minibuffer-local-map)))
- (define-key now-map "\C-w" 'bookmark-yank-word)
- now-map)
- nil 'bookmark-history))))
- (bookmark-set-name old newname)
- (setq bookmark-current-bookmark newname)
- (unless batch (bookmark-bmenu-surreptitiously-rebuild-list))
- (helm-bookmark-maybe-save-bookmark) newname))
-
-(defun helm-bookmark-run-edit ()
- "Run `helm-bookmark-edit-bookmark' from keyboard."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-bookmark-edit-bookmark)))
-
-\f
-(defun helm-bookmark-run-jump-other-window ()
- "Jump to bookmark from keyboard."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'bookmark-jump-other-window)))
-
-(defun helm-bookmark-run-delete ()
- "Delete bookmark from keyboard."
- (interactive)
- (with-helm-alive-p
- (when (y-or-n-p "Delete bookmark(s)?")
- (helm-exit-and-execute-action 'helm-delete-marked-bookmarks))))
-
-(defun helm-bookmark-get-bookmark-from-name (bmk)
- "Return bookmark name even if it is a bookmark with annotation.
-e.g prepended with *."
- (let ((bookmark (replace-regexp-in-string "\\`\\*" "" bmk)))
- (if (assoc bookmark bookmark-alist) bookmark bmk)))
-
-(defun helm-delete-marked-bookmarks (_ignore)
- "Delete this bookmark or all marked bookmarks."
- (cl-dolist (i (helm-marked-candidates))
- (bookmark-delete (helm-bookmark-get-bookmark-from-name i)
- 'batch)))
-
-
-;;;###autoload
-(defun helm-bookmarks ()
- "Preconfigured `helm' for bookmarks."
- (interactive)
- (helm :sources '(helm-source-bookmarks
- helm-source-bookmark-set)
- :buffer "*helm bookmarks*"
- :default (buffer-name helm-current-buffer)))
-
-;;;###autoload
-(defun helm-filtered-bookmarks ()
- "Preconfigured helm for bookmarks (filtered by category).
-Optional source `helm-source-bookmark-addressbook' is loaded
-only if external library addressbook-bookmark.el is available."
- (interactive)
- (helm :sources helm-bookmark-default-filtered-sources
- :prompt "Search Bookmark: "
- :buffer "*helm filtered bookmarks*"
- :default (list (thing-at-point 'symbol)
- (buffer-name helm-current-buffer))))
-
-(provide 'helm-bookmark)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-bookmark.el ends here
+++ /dev/null
-;;; helm-buffers.el --- helm support for buffers. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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:
-\f
-(require 'cl-lib)
-(require 'helm)
-(require 'helm-types)
-(require 'helm-utils)
-(require 'helm-elscreen)
-(require 'helm-grep)
-(require 'helm-plugin)
-(require 'helm-regexp)
-(require 'helm-help)
-
-(declare-function ido-make-buffer-list "ido" (default))
-(declare-function ido-add-virtual-buffers-to-list "ido")
-(declare-function helm-comp-read "helm-mode")
-
-\f
-(defgroup helm-buffers nil
- "Buffers related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-boring-buffer-regexp-list
- '("\\` " "\\*helm" "\\*helm-mode" "\\*Echo Area" "\\*Minibuf")
- "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."
- :type '(repeat (choice regexp))
- :group 'helm-buffers)
-
-(defcustom helm-white-buffer-regexp-list nil
- "The regexp list of not boring buffers.
-These buffers will be displayed even if they match one of
-`helm-boring-buffer-regexp-list'."
- :type '(repeat (choice regexp))
- :group 'helm-buffers)
-
-(defcustom helm-buffers-favorite-modes '(lisp-interaction-mode
- emacs-lisp-mode
- text-mode
- org-mode)
- "List of preferred mode to open new buffers with."
- :type '(repeat (choice function))
- :group 'helm-buffers)
-
-(defcustom helm-buffer-max-length 20
- "Max length of buffer names before truncate.
-When disabled (nil) use the longest buffer-name length found."
- :group 'helm-buffers
- :type '(choice (const :tag "Disabled" nil)
- (integer :tag "Length before truncate")))
-
-(defcustom helm-buffer-details-flag t
- "Always show details in buffer list when non--nil."
- :group 'helm-buffers
- :type 'boolean)
-
-(defcustom helm-buffers-fuzzy-matching 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."
- :group 'helm-buffers
- :type 'boolean)
-
-(defcustom helm-buffer-skip-remote-checking nil
- "Ignore checking for `file-exists-p' on remote files."
- :group 'helm-buffers
- :type 'boolean)
-
-(defcustom helm-buffers-truncate-lines t
- "Truncate lines in `helm-buffers-list' when non--nil."
- :group 'helm-buffers
- :type 'boolean)
-
-(defcustom helm-mini-default-sources '(helm-source-buffers-list
- helm-source-recentf
- helm-source-buffer-not-found)
- "Default sources list used in `helm-mini'."
- :group 'helm-buffers
- :type '(repeat (choice symbol)))
-
-(defcustom helm-buffers-end-truncated-string "..."
- "The string to display at end of truncated buffer names."
- :type 'string
- :group 'helm-buffers)
-
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-buffers-faces nil
- "Customize the appearance of helm-buffers."
- :prefix "helm-"
- :group 'helm-buffers
- :group 'helm-faces)
-
-(defface helm-buffer-saved-out
- '((t (:foreground "red" :background "black")))
- "Face used for buffer files modified outside of emacs."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-not-saved
- '((t (:foreground "Indianred2")))
- "Face used for buffer files not already saved on disk."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-size
- '((((background dark)) :foreground "RosyBrown")
- (((background light)) :foreground "SlateGray"))
- "Face used for buffer size."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-process
- '((t (:foreground "Sienna3")))
- "Face used for process status in buffer."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-directory
- '((t (:foreground "DarkRed" :background "LightGray")))
- "Face used for directories in `helm-buffers-list'."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-file
- '((t :inherit font-lock-builtin-face))
- "Face for buffer file names in `helm-buffers-list'."
- :group 'helm-buffers-faces)
-
-\f
-;;; Buffers keymap
-;;
-(defvar helm-buffer-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- ;; No need to have separate command for grep and zgrep
- ;; as we don't use recursivity for buffers.
- ;; So use zgrep for both as it is capable to handle non--compressed files.
- (define-key map (kbd "M-g s") 'helm-buffer-run-zgrep)
- (define-key map (kbd "C-s") 'helm-buffers-run-multi-occur)
- (define-key map (kbd "C-c o") 'helm-buffer-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-buffer-switch-other-frame)
- (define-key map (kbd "C-c =") 'helm-buffer-run-ediff)
- (define-key map (kbd "M-=") 'helm-buffer-run-ediff-merge)
- (define-key map (kbd "C-=") 'helm-buffer-diff-persistent)
- (define-key map (kbd "M-U") 'helm-buffer-revert-persistent)
- (define-key map (kbd "C-c d") 'helm-buffer-run-kill-persistent)
- (define-key map (kbd "M-D") 'helm-buffer-run-kill-buffers)
- (define-key map (kbd "C-x C-s") 'helm-buffer-save-persistent)
- (define-key map (kbd "C-M-%") 'helm-buffer-run-query-replace-regexp)
- (define-key map (kbd "M-%") 'helm-buffer-run-query-replace)
- (define-key map (kbd "M-m") 'helm-toggle-all-marks)
- (define-key map (kbd "M-a") 'helm-mark-all)
- (define-key map (kbd "C-]") 'helm-toggle-buffers-details)
- (define-key map (kbd "C-c a") 'helm-buffers-toggle-show-hidden-buffers)
- (define-key map (kbd "<C-M-SPC>") 'helm-buffers-mark-similar-buffers)
- map)
- "Keymap for buffer sources in helm.")
-
-(defvar helm-buffers-ido-virtual-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-c o") 'helm-ff-run-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-ff-run-switch-other-frame)
- (define-key map (kbd "M-g s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g z") 'helm-ff-run-zgrep)
- (define-key map (kbd "M-D") 'helm-ff-run-delete-file)
- (define-key map (kbd "C-c C-x") 'helm-ff-run-open-file-externally)
- map))
-
-\f
-(defvar helm-buffers-list-cache nil)
-(defvar helm-buffer-max-len-mode nil)
-
-(defun helm-buffers-list--init ()
- ;; Issue #51 Create the list before `helm-buffer' creation.
- (setq helm-buffers-list-cache (funcall (helm-attr 'buffer-list)))
- (let ((result (cl-loop for b in helm-buffers-list-cache
- maximize (length b) into len-buf
- maximize (length (with-current-buffer b
- (format-mode-line mode-name)))
- into len-mode
- finally return (cons len-buf len-mode))))
- (unless (default-value 'helm-buffer-max-length)
- (helm-set-local-variable 'helm-buffer-max-length (car result)))
- (unless (default-value 'helm-buffer-max-len-mode)
- (helm-set-local-variable 'helm-buffer-max-len-mode (cdr result)))))
-
-(defclass helm-source-buffers (helm-source-sync helm-type-buffer)
- ((buffer-list
- :initarg :buffer-list
- :initform #'helm-buffer-list
- :custom function
- :documentation
- " A function with no arguments to create buffer list.")
- (init :initform 'helm-buffers-list--init)
- (candidates :initform helm-buffers-list-cache)
- (matchplugin :initform nil)
- (match :initform 'helm-buffers-match-function)
- (persistent-action :initform 'helm-buffers-list-persistent-action)
- (resume :initform (lambda ()
- (run-with-idle-timer
- 0.1 nil (lambda ()
- (with-helm-buffer
- (helm-force-update))))))
- (keymap :initform helm-buffer-map)
- (migemo :initform 'nomultimatch)
- (volatile :initform t)
- (help-message :initform 'helm-buffer-help-message)
- (persistent-help
- :initform
- "Show this buffer / C-u \\[helm-execute-persistent-action]: Kill this buffer")))
-
-(defvar helm-source-buffers-list nil)
-
-(defvar helm-source-buffer-not-found
- (helm-build-dummy-source
- "Create buffer"
- :action (helm-make-actions
- "Create buffer (C-u choose mode)"
- (lambda (candidate)
- (let ((mjm (or (and helm-current-prefix-arg
- (intern-soft (helm-comp-read
- "Major-mode: "
- helm-buffers-favorite-modes)))
- (cl-loop for (r . m) in auto-mode-alist
- when (string-match r candidate)
- return m)))
- (buffer (get-buffer-create candidate)))
- (if mjm
- (with-current-buffer buffer (funcall mjm))
- (set-buffer-major-mode buffer))
- (switch-to-buffer buffer))))))
-
-(defvar ido-temp-list)
-(defvar ido-ignored-list)
-(defvar ido-process-ignore-lists)
-(defvar ido-use-virtual-buffers)
-(defvar ido-virtual-buffers)
-
-(defvar helm-source-ido-virtual-buffers
- (helm-build-sync-source "Ido virtual buffers"
- :candidates (lambda ()
- (let (ido-temp-list
- ido-ignored-list
- (ido-process-ignore-lists t))
- (when ido-use-virtual-buffers
- (ido-add-virtual-buffers-to-list)
- ido-virtual-buffers)))
- :fuzzy-match helm-buffers-fuzzy-matching
- :keymap helm-buffers-ido-virtual-map
- :help-message 'helm-buffers-ido-virtual-help-message
- :action '(("Find file" . helm-find-many-files)
- ("Find file other window" . find-file-other-window)
- ("Find file other frame" . find-file-other-frame)
- ("Find file as root" . helm-find-file-as-root)
- ("Grep File(s) `C-u recurse'" . helm-find-files-grep)
- ("Zgrep File(s) `C-u Recurse'" . helm-ff-zgrep)
- ("View file" . view-file)
- ("Delete file(s)" . helm-delete-marked-files)
- ("Open file externally (C-u to choose)"
- . helm-open-file-externally))))
-
-\f
-(defvar ido-use-virtual-buffers)
-(defvar ido-ignore-buffers)
-(defun helm-buffer-list ()
- "Return the current list of buffers.
-Currently visible buffers are put at the end of the list.
-See `ido-make-buffer-list' for more infos."
- (require 'ido)
- (let ((ido-process-ignore-lists t)
- ido-ignored-list
- ido-ignore-buffers
- ido-use-virtual-buffers)
- (ido-make-buffer-list nil)))
-
-(defun helm-buffer-size (buffer)
- "Return size of BUFFER."
- (with-current-buffer buffer
- (save-restriction
- (widen)
- (helm-file-human-size
- (- (position-bytes (point-max))
- (position-bytes (point-min)))))))
-
-(defun helm-buffer--show-details (buf-name prefix help-echo
- size mode dir face1 face2
- proc details type)
- (append
- (list
- (concat prefix
- (propertize buf-name 'face face1
- 'help-echo help-echo
- 'type type)))
- (and details
- (list size mode
- (propertize
- (if proc
- (format "(%s %s in `%s')"
- (process-name proc)
- (process-status proc) dir)
- (format "(in `%s')" dir))
- 'face face2)))))
-
-(defun helm-buffer--details (buffer &optional details)
- (let* ((mode (with-current-buffer buffer (format-mode-line mode-name)))
- (buf (get-buffer buffer))
- (size (propertize (helm-buffer-size buf)
- 'face 'helm-buffer-size))
- (proc (get-buffer-process buf))
- (dir (with-current-buffer buffer (abbreviate-file-name default-directory)))
- (file-name (helm-aif (buffer-file-name buf) (abbreviate-file-name it)))
- (name (buffer-name buf))
- (name-prefix (when (file-remote-p dir)
- (propertize "@ " 'face 'helm-ff-prefix))))
- ;; No fancy things on remote buffers.
- (if (and name-prefix helm-buffer-skip-remote-checking)
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-buffer-file 'helm-buffer-process nil details 'filebuf)
- (cond
- ( ;; A dired buffer.
- (rassoc buf dired-buffers)
- (helm-buffer--show-details
- name name-prefix dir size mode dir
- 'helm-buffer-directory 'helm-buffer-process nil details 'dired))
- ;; A buffer file modified somewhere outside of emacs.=>red
- ((and file-name
- (file-exists-p file-name)
- (not (verify-visited-file-modtime buf)))
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-buffer-saved-out 'helm-buffer-process nil details 'modout))
- ;; A new buffer file not already saved on disk (or a deleted file) .=>indianred2
- ((and file-name (not (file-exists-p file-name)))
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-buffer-not-saved 'helm-buffer-process nil details 'notsaved))
- ;; A buffer file modified and not saved on disk.=>orange
- ((and file-name (buffer-modified-p buf))
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-ff-symlink 'helm-buffer-process nil details 'mod))
- ;; A buffer file not modified and saved on disk.=>green
- (file-name
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-buffer-file 'helm-buffer-process nil details 'filebuf))
- ;; Any non--file buffer.=>grey italic
- (t
- (helm-buffer--show-details
- name (and proc name-prefix) dir size mode dir
- 'italic 'helm-buffer-process proc details 'nofile))))))
-
-(defun helm-highlight-buffers (buffers _source)
- "Transformer function to highlight BUFFERS list.
-Should be called after others transformers i.e (boring buffers)."
- (cl-loop for i in buffers
- for (name size mode meta) = (if helm-buffer-details-flag
- (helm-buffer--details i 'details)
- (helm-buffer--details i))
- for truncbuf = (if (> (string-width name) helm-buffer-max-length)
- (helm-substring-by-width
- name helm-buffer-max-length
- helm-buffers-end-truncated-string)
- (concat name
- (make-string
- (- (+ helm-buffer-max-length
- (length helm-buffers-end-truncated-string))
- (string-width name)) ? )))
- for len = (length mode)
- when (> len helm-buffer-max-len-mode)
- do (setq helm-buffer-max-len-mode len)
- for fmode = (concat (make-string
- (- (max helm-buffer-max-len-mode len) len) ? )
- mode)
- ;; The max length of a number should be 1023.9X where X is the
- ;; units, this is 7 characters.
- for formatted-size = (and size (format "%7s" size))
- collect (cons (if helm-buffer-details-flag
- (concat truncbuf "\t" formatted-size
- " " fmode " " meta)
- name)
- (get-buffer i))))
-
-(defun helm-buffer--get-preselection (buffer)
- (let ((bufname (buffer-name buffer)))
- (concat "^"
- (if (and (null helm-buffer-details-flag)
- (numberp helm-buffer-max-length)
- (> (string-width bufname)
- helm-buffer-max-length))
- (regexp-quote
- (helm-substring-by-width
- bufname helm-buffer-max-length
- helm-buffers-end-truncated-string))
- (concat (regexp-quote bufname)
- (if helm-buffer-details-flag
- "$" "[[:blank:]]+"))))))
-
-(defun helm-toggle-buffers-details ()
- (interactive)
- (let ((preselect (helm-buffer--get-preselection
- (helm-get-selection))))
- (when helm-alive-p
- (setq helm-buffer-details-flag (not helm-buffer-details-flag))
- (helm-force-update preselect))))
-
-(defun helm-buffers-sort-transformer (candidates _source)
- (if (string= helm-pattern "")
- candidates
- (sort candidates
- (lambda (s1 s2)
- (< (string-width s1) (string-width s2))))))
-
-(defun helm-buffers-mark-similar-buffers-1 ()
- (with-helm-window
- (let ((type (get-text-property
- 0 'type (helm-get-selection nil 'withprop))))
- (save-excursion
- (goto-char (helm-get-previous-header-pos))
- (helm-next-line)
- (let* ((next-head (helm-get-next-header-pos))
- (end (and next-head
- (save-excursion
- (goto-char next-head)
- (forward-line -1)
- (point))))
- (maxpoint (or end (point-max))))
- (while (< (point) maxpoint)
- (helm-mark-current-line)
- (let ((cand (helm-get-selection nil 'withprop)))
- (when (and (not (helm-this-visible-mark))
- (eq (get-text-property 0 'type cand) type))
- (helm-make-visible-mark)))
- (forward-line 1) (end-of-line))))
- (helm-mark-current-line)
- (helm-display-mode-line (helm-get-current-source) t)
- (message "%s candidates marked" (length helm-marked-candidates)))))
-
-(defun helm-buffers-mark-similar-buffers ()
- "Mark All buffers that have same property `type' than current.
-i.e same color."
- (interactive)
- (let ((marked (helm-marked-candidates)))
- (if (and (>= (length marked) 1)
- (with-helm-window helm-visible-mark-overlays))
- (helm-unmark-all)
- (helm-buffers-mark-similar-buffers-1))))
-
-\f
-;;; match functions
-;;
-(defun helm-buffer--match-mjm (pattern mjm)
- (when (string-match "\\`\\*" pattern)
- (cl-loop with patterns = (split-string (substring pattern 1) ",")
- for pat in patterns
- if (string-match "\\`!" pat)
- collect (string-match (substring pat 1) mjm) into neg
- else collect (string-match pat mjm) into pos
- finally return
- (let ((neg-test (cl-loop for i in neg thereis (numberp i)))
- (pos-test (cl-loop for i in pos thereis (numberp i))))
- (or
- (and neg (not pos) (not neg-test))
- (and pos pos-test)
- (and neg neg-test (not neg-test)))))))
-
-(defun helm-buffer--match-pattern (pattern candidate)
- (let ((bfn (if (and helm-buffers-fuzzy-matching
- (not helm-migemo-mode)
- (not (string-match "\\`\\^" pattern)))
- #'helm--mapconcat-pattern
- #'identity))
- (mfn (if helm-migemo-mode
- #'helm-mm-migemo-string-match #'string-match)))
- (if (string-match "\\`!" pattern)
- (not (funcall mfn (funcall bfn (substring pattern 1))
- candidate))
- (funcall mfn (funcall bfn pattern) candidate))))
-
-(defun helm-buffers--match-from-mjm (candidate)
- (let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate))
- (buf (get-buffer cand))
- (regexp (cl-loop with pattern = helm-pattern
- for p in (split-string pattern)
- when (string-match "\\`\\*" p)
- return p)))
- (if regexp
- (when buf
- (with-current-buffer buf
- (let ((mjm (format-mode-line mode-name)))
- (helm-buffer--match-mjm regexp mjm))))
- t)))
-
-(defun helm-buffers--match-from-pat (candidate)
- (let ((regexp-list (cl-loop with pattern = helm-pattern
- for p in (split-string pattern)
- unless (string-match
- "\\`\\(\\*\\)\\|\\(/\\)\\|\\(@\\)" p)
- collect p)))
- (if regexp-list
- (cl-loop for re in regexp-list
- always (helm-buffer--match-pattern re candidate))
- t)))
-
-(defun helm-buffers--match-from-inside (candidate)
- (let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate))
- (buf (get-buffer cand))
- (regexp (cl-loop with pattern = helm-pattern
- for p in (split-string pattern)
- when (string-match "\\`@\\(.*\\)" p)
- return (match-string 1 p))))
- (if (and buf regexp)
- (with-current-buffer buf
- (save-excursion
- (goto-char (point-min))
- (if helm-migemo-mode
- (helm-mm-migemo-forward regexp nil t)
- (re-search-forward regexp nil t))))
- t)))
-
-(defun helm-buffers--match-from-directory (candidate)
- (let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate))
- (buf (get-buffer cand))
- (buf-fname (buffer-file-name buf))
- (regexps (cl-loop with pattern = helm-pattern
- for p in (split-string pattern)
- when (string-match "\\`/" p)
- collect p)))
- (if regexps
- (cl-loop for re in regexps
- thereis
- (and buf-fname
- (string-match
- (substring re 1) (helm-basedir buf-fname))))
- t)))
-
-(defun helm-buffers-match-function (candidate)
- "Default function to match buffers."
- (and (helm-buffers--match-from-pat candidate)
- (helm-buffers--match-from-mjm candidate)
- (helm-buffers--match-from-inside candidate)
- (helm-buffers--match-from-directory candidate)))
-
-\f
-(defun helm-buffer-query-replace-1 (&optional regexp-flag buffers)
- "Query replace in marked buffers.
-If REGEXP-FLAG is given use `query-replace-regexp'."
- (let ((prompt (if regexp-flag "Query replace regexp" "Query replace"))
- (bufs (or buffers (helm-marked-candidates)))
- (helm--reading-passwd-or-string t))
- (cl-loop with args = (query-replace-read-args prompt regexp-flag t)
- for buf in bufs
- do
- (save-window-excursion
- (switch-to-buffer buf)
- (save-excursion
- (let ((case-fold-search t))
- (goto-char (point-min))
- (apply #'perform-replace
- (list (nth 0 args) (nth 1 args)
- t regexp-flag (nth 2 args) nil
- multi-query-replace-map))))))))
-
-(defun helm-buffer-query-replace-regexp (_candidate)
- (helm-buffer-query-replace-1 'regexp))
-
-(defun helm-buffer-query-replace (_candidate)
- (helm-buffer-query-replace-1))
-
-(defun helm-buffer-toggle-diff (candidate)
- "Toggle diff buffer CANDIDATE with it's file."
- (let (helm-persistent-action-use-special-display)
- (helm-aif (get-buffer-window "*Diff*")
- (progn (kill-buffer "*Diff*")
- (set-window-buffer it helm-current-buffer))
- (diff-buffer-with-file (get-buffer candidate)))))
-
-(defun helm-buffer-diff-persistent ()
- "Toggle diff buffer without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'diff-action 'helm-buffer-toggle-diff)
- (helm-execute-persistent-action 'diff-action)))
-
-(defun helm-revert-buffer (candidate)
- (with-current-buffer candidate
- (helm-aif (buffer-file-name)
- (and (file-exists-p it) (revert-buffer t t)))))
-
-(defun helm-revert-marked-buffers (_ignore)
- (mapc 'helm-revert-buffer (helm-marked-candidates)))
-
-(defun helm-buffer-revert-and-update (_candidate)
- (let ((marked (helm-marked-candidates))
- (preselect (helm-buffers--quote-truncated-buffer
- (helm-get-selection))))
- (cl-loop for buf in marked do (helm-revert-buffer buf))
- (when (> (length marked) 1) (helm-unmark-all))
- (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-execute-persistent-action 'revert-action)))
-
-(defun helm-buffer-save-and-update (_candidate)
- (let ((marked (helm-marked-candidates))
- (preselect (helm-get-selection nil t))
- (enable-recursive-minibuffers t))
- (cl-loop for buf in marked do
- (with-current-buffer (get-buffer buf)
- (when (buffer-file-name) (save-buffer))))
- (when (> (length marked) 1) (helm-unmark-all))
- (helm-force-update (regexp-quote preselect))))
-
-(defun helm-buffer-save-persistent ()
- "Save buffer without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'save-action '(helm-buffer-save-and-update . never-split))
- (helm-execute-persistent-action 'save-action)))
-
-(defun helm-buffer-run-kill-persistent ()
- "Kill buffer without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'kill-action '(helm-buffers-persistent-kill . never-split))
- (helm-execute-persistent-action 'kill-action)))
-
-(defun helm-kill-marked-buffers (_ignore)
- (let* ((bufs (helm-marked-candidates))
- (killed-bufs (cl-count-if 'kill-buffer bufs)))
- (with-helm-buffer
- (setq helm-marked-candidates nil
- helm-visible-mark-overlays nil))
- (message "Killed %s buffer(s)" killed-bufs)))
-
-(defun helm-buffer-run-kill-buffers ()
- "Run kill buffer action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-kill-marked-buffers)))
-
-(defun helm-buffer-run-grep ()
- "Run Grep action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-buffers)))
-
-(defun helm-buffer-run-zgrep ()
- "Run Grep action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-zgrep-buffers)))
-
-(defun helm-buffer-run-query-replace-regexp ()
- "Run Query replace regexp action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-buffer-query-replace-regexp)))
-
-(defun helm-buffer-run-query-replace ()
- "Run Query replace action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-buffer-query-replace)))
-
-(defun helm-buffer-switch-other-window ()
- "Run switch to other window action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-switch-to-buffers-other-window)))
-
-(defun helm-buffer-switch-other-frame ()
- "Run switch to other frame action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'switch-to-buffer-other-frame)))
-
-(defun helm-buffer-switch-to-elscreen ()
- "Run switch to elscreen action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-buffer-on-elscreen)))
-
-(defun helm-buffer-run-ediff ()
- "Run ediff action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ediff-marked-buffers)))
-
-(defun helm-buffer-run-ediff-merge ()
- "Run ediff action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ediff-marked-buffers-merge)))
-
-(defun helm-buffers-persistent-kill-1 (buffer)
- "Persistent action to kill buffer."
- (if (eql (get-buffer buffer) (get-buffer helm-current-buffer))
- (progn
- (message "Can't kill `helm-current-buffer' without quitting session")
- (sit-for 1))
- (with-current-buffer (get-buffer buffer)
- (kill-buffer buffer))
- (helm-delete-current-selection)
- (with-helm-temp-hook 'helm-after-persistent-action-hook
- (helm-force-update (regexp-quote (helm-get-selection nil t))))))
-
-(defun helm-buffers--quote-truncated-buffer (buffer)
- (let ((bufname (and (bufferp buffer)
- (buffer-name buffer))))
- (when bufname
- (regexp-quote
- (if helm-buffer-max-length
- (helm-substring-by-width
- bufname helm-buffer-max-length
- "")
- bufname)))))
-
-(defun helm-buffers-persistent-kill (_buffer)
- (let ((marked (helm-marked-candidates)))
- (unwind-protect
- (cl-loop for b in marked
- do (progn (helm-preselect
- (format "^%s"
- (helm-buffers--quote-truncated-buffer b)))
- (when (y-or-n-p (format "kill buffer (%s)? " b))
- (helm-buffers-persistent-kill-1 b))
- (message nil)))
- (with-helm-buffer
- (setq helm-marked-candidates nil
- helm-visible-mark-overlays nil))
- (helm-force-update (helm-buffers--quote-truncated-buffer
- (helm-get-selection))))))
-
-(defun helm-buffers-list-persistent-action (candidate)
- (let ((current (window-buffer helm-persistent-action-display-window)))
- (if (or (eql current (get-buffer helm-current-buffer))
- (not (eql current (get-buffer candidate))))
- (switch-to-buffer candidate)
- (switch-to-buffer helm-current-buffer))))
-
-(defun helm-ediff-marked-buffers (_candidate &optional merge)
- "Ediff 2 marked buffers or CANDIDATE and `helm-current-buffer'.
-With optional arg MERGE call `ediff-merge-buffers'."
- (let ((lg-lst (length (helm-marked-candidates)))
- buf1 buf2)
- (cl-case lg-lst
- (0
- (error "Error:You have to mark at least 1 buffer"))
- (1
- (setq buf1 helm-current-buffer
- buf2 (cl-first (helm-marked-candidates))))
- (2
- (setq buf1 (cl-first (helm-marked-candidates))
- buf2 (cl-second (helm-marked-candidates))))
- (t
- (error "Error:To much buffers marked!")))
- (if merge
- (ediff-merge-buffers buf1 buf2)
- (ediff-buffers buf1 buf2))))
-
-(defun helm-ediff-marked-buffers-merge (candidate)
- "Ediff merge `helm-current-buffer' with CANDIDATE.
-See `helm-ediff-marked-buffers'."
- (helm-ediff-marked-buffers candidate t))
-
-(defun helm-multi-occur-as-action (_candidate)
- "Multi occur action for `helm-source-buffers-list'.
-Can be used by any source that list buffers."
- (let ((helm-moccur-always-search-in-current
- (if helm-current-prefix-arg
- (not helm-moccur-always-search-in-current)
- helm-moccur-always-search-in-current))
- (buffers (helm-marked-candidates))
- (input (cl-loop for i in (split-string helm-pattern " " t)
- thereis (and (string-match "\\`@\\(.*\\)" i)
- (match-string 1 i)))))
- (helm-multi-occur-1 buffers input)))
-
-(defun helm-buffers-run-multi-occur ()
- "Run `helm-multi-occur-as-action' by key."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-multi-occur-as-action)))
-
-(defun helm-buffers-toggle-show-hidden-buffers ()
- (interactive)
- (with-helm-alive-p
- (let ((filter-attrs (helm-attr 'filtered-candidate-transformer
- helm-source-buffers-list)))
- (if (memq 'helm-shadow-boring-buffers filter-attrs)
- (helm-attrset 'filtered-candidate-transformer
- (cons 'helm-skip-boring-buffers
- (remove 'helm-shadow-boring-buffers
- filter-attrs))
- helm-source-buffers-list t)
- (helm-attrset 'filtered-candidate-transformer
- (cons 'helm-shadow-boring-buffers
- (remove 'helm-skip-boring-buffers
- filter-attrs))
- helm-source-buffers-list t))
- (helm-force-update))))
-
-\f
-;;; Candidate Transformers
-;;
-;;
-(defun helm-skip-boring-buffers (buffers _source)
- (helm-skip-entries buffers
- helm-boring-buffer-regexp-list
- helm-white-buffer-regexp-list))
-
-(defun helm-shadow-boring-buffers (buffers _source)
- "Buffers matching `helm-boring-buffer-regexp' will be
-displayed with the `file-name-shadow' face if available."
- (helm-shadow-entries buffers helm-boring-buffer-regexp-list))
-
-\f
-;;;###autoload
-(defun helm-buffers-list ()
- "Preconfigured `helm' to list buffers."
- (interactive)
- (unless helm-source-buffers-list
- (setq helm-source-buffers-list
- (helm-make-source "Buffers" 'helm-source-buffers)))
- (helm :sources '(helm-source-buffers-list
- helm-source-ido-virtual-buffers
- helm-source-buffer-not-found)
- :buffer "*helm buffers*"
- :keymap helm-buffer-map
- :truncate-lines helm-buffers-truncate-lines))
-
-;;;###autoload
-(defun helm-mini ()
- "Preconfigured `helm' lightweight version \(buffer -> recentf\)."
- (interactive)
- (require 'helm-files)
- (unless helm-source-buffers-list
- (setq helm-source-buffers-list
- (helm-make-source "Buffers" 'helm-source-buffers)))
- (helm :sources helm-mini-default-sources
- :buffer "*helm mini*"
- :ff-transformer-show-only-basename nil
- :truncate-lines helm-buffers-truncate-lines))
-
-(provide 'helm-buffers)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-buffers.el ends here
+++ /dev/null
-;;; helm-color.el --- colors and faces -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-
-;;; Customize Face
-;;
-;;
-(defun helm-custom-faces-init ()
- "Initialize buffer for `helm-source-customize-face'."
- (unless (helm-candidate-buffer)
- (save-selected-window
- (list-faces-display)
- (message nil))
- (helm-init-candidates-in-buffer
- 'global
- (with-current-buffer (get-buffer "*Faces*")
- (buffer-substring
- (next-single-char-property-change (point-min) 'face)
- (point-max))))
- (kill-buffer "*Faces*")))
-
-(defvar helm-source-customize-face
- (helm-build-in-buffer-source "Customize Face"
- :init 'helm-custom-faces-init
- :get-line 'buffer-substring
- :action '(("Customize"
- . (lambda (line)
- (customize-face (intern (car (split-string line))))))
- ("Copy name"
- . (lambda (line)
- (kill-new (car (split-string line " " t)))))))
- "See (info \"(emacs)Faces\")")
-
-;;; Colors browser
-;;
-;;
-(defun helm-colors-init ()
- (unless (helm-candidate-buffer)
- (save-selected-window
- (list-colors-display)
- (message nil))
- (helm-init-candidates-in-buffer
- 'global
- (with-current-buffer (get-buffer "*Colors*")
- (buffer-string)))
- (kill-buffer "*Colors*")))
-
-(defun helm-color-insert-name (candidate)
- (with-helm-current-buffer
- (insert (helm-colors-get-name candidate))))
-
-(defun helm-color-kill-name (candidate)
- (kill-new (helm-colors-get-name candidate)))
-
-(defun helm-color-insert-rgb (candidate)
- (with-helm-current-buffer
- (insert (helm-colors-get-rgb candidate))))
-
-(defun helm-color-kill-rgb (candidate)
- (kill-new (helm-colors-get-rgb candidate)))
-
-(defun helm-color-run-insert-name ()
- "Insert name of color from `helm-source-colors'"
- (interactive)
- (with-helm-alive-p (helm-exit-and-execute-action 'helm-color-insert-name)))
-
-(defun helm-color-run-kill-name ()
- "Kill name of color from `helm-source-colors'"
- (interactive)
- (with-helm-alive-p (helm-exit-and-execute-action 'helm-color-kill-name)))
-
-(defun helm-color-run-insert-rgb ()
- "Insert RGB of color from `helm-source-colors'"
- (interactive)
- (with-helm-alive-p (helm-exit-and-execute-action 'helm-color-insert-rgb)))
-
-(defun helm-color-run-kill-rgb ()
- "Kill RGB of color from `helm-source-colors'"
- (interactive)
- (with-helm-alive-p (helm-exit-and-execute-action 'helm-color-kill-rgb)))
-
-(defvar helm-color-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-c n") 'helm-color-run-insert-name)
- (define-key map (kbd "C-c N") 'helm-color-run-kill-name)
- (define-key map (kbd "C-c r") 'helm-color-run-insert-rgb)
- (define-key map (kbd "C-c R") 'helm-color-run-kill-rgb)
- map))
-
-(defvar helm-source-colors
- (helm-build-in-buffer-source "Colors"
- :init 'helm-colors-init
- :get-line 'buffer-substring
- :keymap helm-color-map
- :persistent-help "Kill entry in RGB format."
- :persistent-action 'helm-color-kill-rgb
- :help-message 'helm-colors-help-message
- :action
- '(("Copy Name (C-c N)" . helm-color-kill-name)
- ("Copy RGB (C-c R)" . helm-color-kill-rgb)
- ("Insert Name (C-c n)" . helm-color-insert-name)
- ("Insert RGB (C-c r)" . helm-color-insert-rgb))))
-
-(defun helm-colors-get-name (candidate)
- "Get color name."
- (replace-regexp-in-string
- " " ""
- (with-temp-buffer
- (insert (capitalize candidate))
- (goto-char (point-min))
- (search-forward-regexp "\\s-\\{2,\\}")
- (delete-region (point) (point-max))
- (buffer-string))))
-
-(defun helm-colors-get-rgb (candidate)
- "Get color RGB."
- (replace-regexp-in-string
- " " ""
- (with-temp-buffer
- (insert (capitalize candidate))
- (goto-char (point-max))
- (search-backward-regexp "\\s-\\{2,\\}")
- (delete-region (point) (point-min))
- (buffer-string))))
-
-;;;###autoload
-(defun helm-colors ()
- "Preconfigured `helm' for color."
- (interactive)
- (helm :sources '(helm-source-colors helm-source-customize-face)
- :buffer "*helm colors*"))
-
-(provide 'helm-color)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-color.el ends here
+++ /dev/null
-;;; helm-command.el --- Helm execute-exended-command. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-mode)
-(require 'helm-elisp)
-
-\f
-(defgroup helm-command nil
- "Emacs command related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-M-x-requires-pattern 0
- "Value of requires-pattern for `helm-M-x'.
-Show all candidates on startup when 0 (default)."
- :group 'helm-command
- :type 'boolean)
-
-(defcustom helm-M-x-always-save-history nil
- "`helm-M-x' Save command in `extended-command-history' even when it fail."
- :group 'helm-command
- :type 'boolean)
-
-(defcustom helm-M-x-reverse-history nil
- "The history source of `helm-M-x' appear in second position when non--nil."
- :group 'helm-command
- :type 'boolean)
-
-(defcustom helm-M-x-fuzzy-match nil
- "Enable fuzzy matching in `helm-M-x' when non--nil.")
-
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-command-faces nil
- "Customize the appearance of helm-command."
- :prefix "helm-"
- :group 'helm-command
- :group 'helm-faces)
-
-(defface helm-M-x-key '((t (:foreground "orange" :underline t)))
- "Face used in helm-M-x to show keybinding."
- :group 'helm-command-faces)
-
-\f
-(defvar helm-M-x-input-history nil)
-
-\f
-(cl-defun helm-M-x-get-major-mode-command-alist (mode-map)
- "Return alist of MODE-MAP."
- (when mode-map
- (cl-loop for key being the key-seqs of mode-map using (key-bindings com)
- for str-key = (key-description key)
- for ismenu = (string-match "<menu-bar>" str-key)
- unless ismenu collect (cons str-key com))))
-
-(defun helm-get-mode-map-from-mode (mode)
- "Guess the mode-map name according to MODE.
-Some modes don't use conventional mode-map name
-so we need to guess mode-map name. e.g python-mode ==> py-mode-map.
-Return nil if no mode-map found."
- (cl-loop ;; Start with a conventional mode-map name.
- with mode-map = (intern-soft (format "%s-map" mode))
- with mode-string = (symbol-name mode)
- with mode-name = (replace-regexp-in-string "-mode" "" mode-string)
- while (not mode-map)
- for count downfrom (length mode-name)
- ;; Return when no result after parsing entire string.
- when (eq count 0) return nil
- for sub-name = (substring mode-name 0 count)
- do (setq mode-map (intern-soft (format "%s-map" (concat sub-name "-mode"))))
- finally return mode-map))
-
-(defun helm-M-x-current-mode-map-alist ()
- "Return mode-map alist of current `major-mode'."
- (let ((map-sym (helm-get-mode-map-from-mode major-mode)))
- (when (and map-sym (boundp map-sym))
- (helm-M-x-get-major-mode-command-alist (symbol-value map-sym)))))
-
-
-(defun helm-M-x-transformer-1 (candidates &optional sort)
- "Transformer function to show bindings in emacs commands.
-Show global bindings and local bindings according to current `major-mode'.
-If SORT is non nil sort list with `helm-generic-sort-fn'.
-Note that SORT should not be used when fuzzy matching because
-fuzzy matching is running its own sort function with a different algorithm."
- (with-helm-current-buffer
- (cl-loop with local-map = (helm-M-x-current-mode-map-alist)
- for cand in candidates
- for local-key = (car (rassq cand local-map))
- for key = (substitute-command-keys (format "\\[%s]" cand))
- collect
- (cons (cond ((and (string-match "^M-x" key) local-key)
- (format "%s (%s)"
- cand (propertize
- local-key
- 'face 'helm-M-x-key)))
- ((string-match "^M-x" key) cand)
- (t (format "%s (%s)"
- cand (propertize
- key
- 'face 'helm-M-x-key))))
- cand)
- into ls
- finally return
- (if sort (sort ls #'helm-generic-sort-fn) ls))))
-
-(defun helm-M-x-transformer (candidates _source)
- "Transformer function for `helm-M-x' candidates."
- (helm-M-x-transformer-1 candidates (null helm--in-fuzzy)))
-
-(defun helm-M-x-transformer-hist (candidates _source)
- "Transformer function for `helm-M-x' candidates."
- (helm-M-x-transformer-1 candidates))
-
-(defun helm-M-x--notify-prefix-arg ()
- ;; Notify a prefix-arg set AFTER calling M-x.
- (when prefix-arg
- (with-helm-window
- (helm-display-mode-line (helm-get-current-source) 'force))))
-
-(defun helm-cmd--get-current-function-name ()
- (save-excursion
- (beginning-of-defun)
- (cadr (split-string (buffer-substring-no-properties
- (point-at-bol) (point-at-eol))))))
-
-(defun helm-cmd--get-preconfigured-commands (&optional dir)
- (let* ((helm-dir (or dir (helm-basedir (locate-library "helm"))))
- (helm-autoload-file (expand-file-name "helm-autoloads.el" helm-dir))
- results)
- (when (file-exists-p helm-autoload-file)
- (with-temp-buffer
- (insert-file-contents helm-autoload-file)
- (while (re-search-forward "Preconfigured" nil t)
- (push (substring (helm-cmd--get-current-function-name) 1) results))))
- results))
-
-(defun helm-M-x-read-extended-command (&optional collection history)
- "Read command name to invoke in `helm-M-x'.
-Helm completion is not provided when executing or defining
-kbd macros.
-Optional arg COLLECTION is to allow using another COLLECTION
-than the default which is OBARRAY."
- (if (or defining-kbd-macro executing-kbd-macro)
- (if helm-mode
- (unwind-protect
- (progn
- (helm-mode -1)
- (read-extended-command))
- (helm-mode 1))
- (read-extended-command))
- (let* ((orig-fuzzy-sort-fn helm-fuzzy-sort-fn)
- (helm-fuzzy-sort-fn (lambda (candidates source)
- (funcall orig-fuzzy-sort-fn
- candidates source 'real)))
- (helm--mode-line-display-prefarg t)
- (tm (run-at-time 1 0.1 'helm-M-x--notify-prefix-arg))
- (helm-move-selection-after-hook
- (cons (lambda () (setq current-prefix-arg nil))
- helm-move-selection-after-hook)))
- (setq extended-command-history
- (cl-loop for c in extended-command-history
- when (and c (commandp (intern c)))
- do (set-text-properties 0 (length c) nil c)
- and collect c))
- (unwind-protect
- (let ((msg "Error: Specifying a prefix arg before calling `helm-M-x'"))
- (when current-prefix-arg
- (ding)
- (message "%s" msg)
- (while (not (sit-for 1))
- (discard-input))
- (user-error msg))
- (setq current-prefix-arg nil)
- (helm-comp-read
- "M-x " (or collection obarray)
- :test 'commandp
- :requires-pattern helm-M-x-requires-pattern
- :name "Emacs Commands"
- :buffer "*helm M-x*"
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe this command"
- :history (or history extended-command-history)
- :reverse-history helm-M-x-reverse-history
- :input-history 'helm-M-x-input-history
- :del-input nil
- :help-message 'helm-M-x-help-message
- :must-match t
- :fuzzy helm-M-x-fuzzy-match
- :nomark t
- :candidates-in-buffer t
- :fc-transformer 'helm-M-x-transformer
- :hist-fc-transformer 'helm-M-x-transformer-hist))
- (cancel-timer tm)
- (setq helm--mode-line-display-prefarg nil)))))
-
-;;;###autoload
-(defun helm-M-x (arg &optional command-name)
- "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, are passed AFTER starting `helm-M-x'.
-
-You can get help on each command by persistent action."
- (interactive (list current-prefix-arg (helm-M-x-read-extended-command)))
- (let ((sym-com (and (stringp command-name) (intern-soft command-name))))
- ;; Avoid having `this-command' set to *exit-minibuffer.
- (setq this-command sym-com
- ;; Handle C-x z (repeat) Issue #322
- real-this-command sym-com)
- ;; If helm-M-x is called with regular emacs completion (kmacro)
- ;; use the value of arg otherwise use helm-current-prefix-arg.
- (let ((prefix-arg (or helm-current-prefix-arg arg)))
- ;; This ugly construct is to save history even on error.
- (unless helm-M-x-always-save-history
- (command-execute sym-com 'record))
- (setq extended-command-history
- (cons command-name
- (delete command-name extended-command-history)))
- (when helm-M-x-always-save-history
- (command-execute sym-com 'record)))))
-
-
-(provide 'helm-command)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-command.el ends here
+++ /dev/null
-;;; helm-config.el --- Applications library for `helm.el' -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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:
-
-\f
-;;; Require
-;;
-;;
-(declare-function async-bytecomp-package-mode "ext:async-bytecomp.el")
-(when (require 'async-bytecomp nil t)
- (and (fboundp 'async-bytecomp-package-mode)
- (async-bytecomp-package-mode 1)))
-
-\f
-(defgroup helm-config nil
- "Various configurations for Helm."
- :group 'helm)
-
-(defcustom helm-command-prefix-key "C-x c"
- "The key `helm-command-prefix' is bound to in the global map."
- :type '(choice (string :tag "Key") (const :tag "no binding"))
- :group 'helm-config
- :set
- (lambda (var key)
- (when (and (boundp var) (symbol-value var))
- (define-key (current-global-map)
- (read-kbd-macro (symbol-value var)) nil))
- (when key
- (define-key (current-global-map)
- (read-kbd-macro key) 'helm-command-prefix))
- (set var key)))
-
-(defcustom helm-minibuffer-history-key "C-r"
- "The key `helm-minibuffer-history' is bound to in minibuffer local maps."
- :type '(choice (string :tag "Key") (const :tag "no binding"))
- :group 'helm-config
- :set
- (lambda (var key)
- (cl-dolist (map '(minibuffer-local-completion-map
- minibuffer-local-filename-completion-map
- minibuffer-local-filename-must-match-map ; Emacs 23.1.+
- minibuffer-local-isearch-map
- minibuffer-local-map
- minibuffer-local-must-match-filename-map ; Older Emacsen
- minibuffer-local-must-match-map
- minibuffer-local-ns-map))
- (when (and (boundp map) (keymapp (symbol-value map)))
- (when (and (boundp var) (symbol-value var))
- (define-key (symbol-value map)
- (read-kbd-macro (symbol-value var)) nil))
- (when key
- (define-key (symbol-value map)
- (read-kbd-macro key) 'helm-minibuffer-history))))
- (set var key)))
-\f
-;;; Command Keymap
-;;
-;;
-(defvar helm-command-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "a") 'helm-apropos)
- (define-key map (kbd "e") 'helm-etags-select)
- (define-key map (kbd "l") 'helm-locate)
- (define-key map (kbd "s") 'helm-surfraw)
- (define-key map (kbd "r") 'helm-regexp)
- (define-key map (kbd "m") 'helm-man-woman)
- (define-key map (kbd "t") 'helm-top)
- (define-key map (kbd "/") 'helm-find)
- (define-key map (kbd "i") 'helm-semantic-or-imenu)
- (define-key map (kbd "I") 'helm-imenu-in-all-buffers)
- (define-key map (kbd "<tab>") 'helm-lisp-completion-at-point)
- (define-key map (kbd "p") 'helm-list-emacs-process)
- (define-key map (kbd "C-x r b") 'helm-filtered-bookmarks)
- (define-key map (kbd "M-y") 'helm-show-kill-ring)
- (define-key map (kbd "C-c <SPC>") 'helm-all-mark-rings)
- (define-key map (kbd "C-x C-f") 'helm-find-files)
- (define-key map (kbd "f") 'helm-multi-files)
- (define-key map (kbd "C-:") 'helm-eval-expression-with-eldoc)
- (define-key map (kbd "C-,") 'helm-calcul-expression)
- (define-key map (kbd "M-x") 'helm-M-x)
- (define-key map (kbd "M-s o") 'helm-occur)
- (define-key map (kbd "M-g s") 'helm-do-grep)
- (define-key map (kbd "M-g a") 'helm-do-grep-ag)
- (define-key map (kbd "c") 'helm-colors)
- (define-key map (kbd "F") 'helm-select-xfont)
- (define-key map (kbd "8") 'helm-ucs)
- (define-key map (kbd "C-c f") 'helm-recentf)
- (define-key map (kbd "C-c g") 'helm-google-suggest)
- (define-key map (kbd "h i") 'helm-info-at-point)
- (define-key map (kbd "h r") 'helm-info-emacs)
- (define-key map (kbd "h g") 'helm-info-gnus)
- (define-key map (kbd "h h") 'helm-documentation)
- (define-key map (kbd "C-x C-b") 'helm-buffers-list)
- (define-key map (kbd "C-x r i") 'helm-register)
- (define-key map (kbd "C-c C-x") 'helm-run-external-command)
- (define-key map (kbd "b") 'helm-resume)
- (define-key map (kbd "C-c g") 'helm-gid)
- (define-key map (kbd "@") 'helm-list-elisp-packages)
- map))
-
-;; Don't override the keymap we just defined with an empty
-;; keymap. This also protect bindings changed by the user.
-(defvar helm-command-prefix)
-(define-prefix-command 'helm-command-prefix)
-(fset 'helm-command-prefix helm-command-map)
-(setq helm-command-prefix helm-command-map)
-
-\f
-;;; Menu
-
-(require 'helm-easymenu)
-
-\f
-;;;###autoload
-(defun helm-configuration ()
- "Customize `helm'."
- (interactive)
- (customize-group "helm"))
-
-\f
-;;; Fontlock
-(cl-dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
- (font-lock-add-keywords
- mode
- '(("(\\<\\(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)
- ("(\\<\\(with-helm-default-directory\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(with-helm-display-same-window\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(with-helm-restore-variables\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(define-helm-type-attribute\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(helm-multi-key-defun\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(helm-while-no-input\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(helm-aif\\)\\>" 1 font-lock-keyword-face))))
-
-\f
-;;; Load the autoload file
-;; It should have been generated either by
-;; package.el or the make file.
-
-(load "helm-autoloads" nil t)
-
-(provide 'helm-config)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-config.el ends here
+++ /dev/null
-;;; helm-dabbrev.el --- Helm implementation of dabbrev. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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)
-(require 'helm-help)
-(require 'helm-elisp) ; For show-completion.
-\f
-(defgroup helm-dabbrev nil
- "Dabbrev related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-dabbrev-always-search-all 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'."
- :group 'helm-dabbrev
- :type 'boolean)
-
-(defcustom helm-dabbrev-max-length-result 20
- "Max length of candidates before searching in all buffers.
-If number of candidates found in current-buffer is <= to this,
-search in all buffers.
-Have no effect when `helm-dabbrev-always-search-all' is non--nil."
- :group 'helm-dabbrev
- :type 'integer)
-
-(defcustom helm-dabbrev-ignored-buffers-regexps
- '("\\*helm" "\\*Messages" "\\*Echo Area" "\\*Buffer List")
- "List of regexps matching names of buffers that helm-dabbrev should not check."
- :group 'helm-dabbrev
- :type '(repeat regexp))
-
-(defcustom helm-dabbrev-related-buffer-fn #'helm-dabbrev--same-major-mode-p
- "A function that decide if a buffer to search in is 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 example.
-
-When nil all buffers are considered related to `current-buffer'."
- :group 'helm-dabbrev
- :type 'function)
-
-(defcustom helm-dabbrev-major-mode-assoc
- '((emacs-lisp-mode . lisp-interaction-mode))
- "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 have same `major-mode'
-than the `current-buffer'.
-This have no effect when `helm-dabbrev-related-buffer-fn' is nil or of course
-bound to a function that doesn't handle this var."
- :type '(alist :key-type symbol :value-type symbol)
- :group 'helm-dabbrev)
-
-(defcustom helm-dabbrev-lineno-around 30
- "Search first in this number of lines before an after point."
- :group 'helm-dabbrev
- :type 'integer)
-
-(defcustom helm-dabbrev-cycle-threshold nil
- "Number of time helm-dabbrev cycle before displaying helm completion.
-When nil or 0 disable cycling."
- :group 'helm-dabbrev
- :type '(choice (const :tag "Cycling disabled" nil) integer))
-
-(defcustom helm-dabbrev-case-fold-search '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)."
- :group 'helm-dabbrev
- :type '(choice (const :tag "Ignore case" t)
- (const :tag "Respect case" nil)
- (other :tag "Smart" 'smart)))
-
-\f
-(defvar helm-dabbrev-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-/") 'helm-next-line)
- (define-key map (kbd "M-:") 'helm-previous-line)
- map))
-
-;; Internal
-(defvar helm-dabbrev--exclude-current-buffer-flag nil)
-(defvar helm-dabbrev--cache nil)
-(defvar helm-dabbrev--data nil)
-(defvar helm-dabbrev--regexp "\\s-\\|\t\\|[(\[\{\"'`=<$;.]\\|\\s\\\\|^")
-(cl-defstruct helm-dabbrev-info dabbrev limits iterator)
-
-\f
-(defun helm-dabbrev--buffer-list ()
- (cl-loop with lst = (buffer-list)
- for buf in (if helm-dabbrev--exclude-current-buffer-flag
- (cdr lst) lst)
- unless (cl-loop for r in helm-dabbrev-ignored-buffers-regexps
- thereis (string-match r (buffer-name buf)))
- collect buf))
-
-(defun helm-dabbrev--same-major-mode-p (start-buffer)
- ;; START-BUFFER is the current-buffer where we start searching.
- ;; Determine the major-mode of START-BUFFER as `cur-maj-mode'.
- ;; Each time the loop go in another buffer we try to find if its
- ;; `major-mode' is:
- ;; - same as the `cur-maj-mode'
- ;; - derived from `cur-maj-mode'
- ;; - have an assoc entry (major-mode . cur-maj-mode)
- ;; - have an rassoc entry (cur-maj-mode . major-mode)
- ;; - check if one of these entries inherit from another one in
- ;; `helm-dabbrev-major-mode-assoc'.
- (let* ((cur-maj-mode (with-current-buffer start-buffer major-mode))
- (c-assoc-mode (assq cur-maj-mode helm-dabbrev-major-mode-assoc))
- (c-rassoc-mode (rassq cur-maj-mode helm-dabbrev-major-mode-assoc))
- (o-assoc-mode (assq major-mode helm-dabbrev-major-mode-assoc))
- (o-rassoc-mode (rassq major-mode helm-dabbrev-major-mode-assoc))
- (cdr-c-assoc-mode (cdr c-assoc-mode))
- (cdr-o-assoc-mode (cdr o-assoc-mode)))
- (or (eq major-mode cur-maj-mode)
- (derived-mode-p cur-maj-mode)
- (or (eq cdr-c-assoc-mode major-mode)
- (eq (car c-rassoc-mode) major-mode)
- (eq (cdr (assq cdr-c-assoc-mode helm-dabbrev-major-mode-assoc))
- major-mode)
- (eq (car (rassq cdr-c-assoc-mode helm-dabbrev-major-mode-assoc))
- major-mode))
- (or (eq cdr-o-assoc-mode cur-maj-mode)
- (eq (car o-rassoc-mode) cur-maj-mode)
- (eq (cdr (assq cdr-o-assoc-mode helm-dabbrev-major-mode-assoc))
- cur-maj-mode)
- (eq (car (rassq cdr-o-assoc-mode helm-dabbrev-major-mode-assoc))
- cur-maj-mode)))))
-
-(defun helm-dabbrev--collect (str limit ignore-case all)
- (let* ((case-fold-search ignore-case)
- (buffer1 (current-buffer)) ; start buffer.
- (minibuf (minibufferp buffer1))
- result pos-before pos-after
- (search-and-store
- (lambda (pattern direction)
- (while (cl-case direction
- (1 (search-forward pattern nil t))
- (-1 (search-backward pattern nil t))
- (2 (let ((pos
- (save-excursion
- (forward-line
- helm-dabbrev-lineno-around)
- (point))))
- (setq pos-after pos)
- (search-forward pattern pos t)))
- (-2 (let ((pos
- (save-excursion
- (forward-line
- (- helm-dabbrev-lineno-around))
- (point))))
- (setq pos-before pos)
- (search-backward pattern pos t))))
- (let* ((replace-regexp (concat "\\(" helm-dabbrev--regexp "\\)\\'"))
- (match-1 (helm-aif (thing-at-point 'symbol)
- ;; `thing-at-point' returns
- ;; the quote outside of e-lisp mode,
- ;; e.g in message mode,
- ;; `foo' => foo'
- ;; but in e-lisp like modes:
- ;; `foo' => foo
- ;; so remove it [1].
- (replace-regexp-in-string
- replace-regexp
- "" (substring-no-properties it))))
- (match-2 (helm-aif (thing-at-point 'filename)
- ;; Same as in [1].
- (replace-regexp-in-string
- replace-regexp
- "" (substring-no-properties it))))
- (lst (if (string= match-1 match-2)
- (list match-1)
- (list match-1 match-2))))
- (cl-loop for match in lst
- unless (or (string= str match)
- (member match result))
- do (push match result)))))))
- (cl-loop for buf in (if all (helm-dabbrev--buffer-list)
- (list (current-buffer)))
-
- do (with-current-buffer buf
- (when (or minibuf ; check against all buffers when in minibuffer.
- (if helm-dabbrev-related-buffer-fn
- (funcall helm-dabbrev-related-buffer-fn buffer1)
- t))
- (save-excursion
- ;; Start searching before thing before point.
- (goto-char (- (point) (length str)))
- ;; Search the last 30 lines before point.
- (funcall search-and-store str -2)) ; store pos [1]
- (save-excursion
- ;; Search the next 30 lines after point.
- (funcall search-and-store str 2)) ; store pos [2]
- (save-excursion
- ;; Search all before point.
- (goto-char pos-before) ; start from [1]
- (funcall search-and-store str -1))
- (save-excursion
- ;; Search all after point.
- (goto-char pos-after) ; start from [2]
- (funcall search-and-store str 1))))
- when (> (length result) limit) return (nreverse result)
- finally return (nreverse result))))
-
-(defun helm-dabbrev--get-candidates (abbrev)
- (cl-assert abbrev nil "[No Match]")
- (with-current-buffer (current-buffer)
- (let* ((dabbrev-get (lambda (str all-bufs)
- (helm-dabbrev--collect
- str helm-candidate-number-limit
- (cl-case helm-dabbrev-case-fold-search
- (smart (helm-set-case-fold-search-1 abbrev))
- (t helm-dabbrev-case-fold-search))
- all-bufs)))
- (lst (funcall dabbrev-get abbrev helm-dabbrev-always-search-all)))
- (if (and (not helm-dabbrev-always-search-all)
- (<= (length lst) helm-dabbrev-max-length-result))
- ;; Search all but don't recompute current-buffer.
- (let ((helm-dabbrev--exclude-current-buffer-flag t))
- (append lst (funcall dabbrev-get abbrev 'all-bufs)))
- lst))))
-\f
-(defun helm-dabbrev-default-action (candidate)
- (with-helm-current-buffer
- (let* ((limits (helm-bounds-of-thing-before-point
- helm-dabbrev--regexp))
- (beg (car limits))
- (end (point)))
- (run-with-timer
- 0.01 nil
- 'helm-insert-completion-at-point
- beg end candidate))))
-
-;;;###autoload
-(defun helm-dabbrev ()
- "Preconfigured helm for dynamic abbreviations."
- (interactive)
- (let ((dabbrev (helm-thing-before-point nil helm-dabbrev--regexp))
- (limits (helm-bounds-of-thing-before-point helm-dabbrev--regexp))
- (enable-recursive-minibuffers t)
- (cycling-disabled-p (or (null helm-dabbrev-cycle-threshold)
- (zerop helm-dabbrev-cycle-threshold)))
- (helm-execute-action-at-once-if-one t)
- (helm-quit-if-no-candidate
- (lambda ()
- (message "[Helm-dabbrev: No expansion found]"))))
- (cl-assert (and (stringp dabbrev) (not (string= dabbrev "")))
- nil "[Helm-dabbrev: Nothing found before point]")
- (when (and
- ;; have been called at least once.
- (helm-dabbrev-info-p helm-dabbrev--data)
- ;; But user have moved with some other command
- ;; in the meaning time.
- (not (eq last-command 'helm-dabbrev)))
- (setq helm-dabbrev--data nil))
- (when cycling-disabled-p
- (setq helm-dabbrev--cache (helm-dabbrev--get-candidates dabbrev)))
- (unless (or cycling-disabled-p
- (helm-dabbrev-info-p helm-dabbrev--data))
- (setq helm-dabbrev--cache (helm-dabbrev--get-candidates dabbrev))
- (setq helm-dabbrev--data
- (make-helm-dabbrev-info
- :dabbrev dabbrev
- :limits limits
- :iterator
- (helm-iter-list
- (cl-loop for i in helm-dabbrev--cache when
- (and i (string-match
- (concat "^" (regexp-quote dabbrev)) i))
- collect i into selection
- when (and selection
- (= (length selection)
- helm-dabbrev-cycle-threshold))
- ;; When selection len reach
- ;; `helm-dabbrev-cycle-threshold'
- ;; return selection.
- return selection
- ;; selection len never reach
- ;; `helm-dabbrev-cycle-threshold'
- ;; return selection.
- finally return selection)))))
- (let ((iter (and (helm-dabbrev-info-p helm-dabbrev--data)
- (helm-dabbrev-info-iterator helm-dabbrev--data)))
- deactivate-mark)
- ;; Cycle until iterator is consumed.
- (helm-aif (and iter (helm-iter-next iter))
- (progn
- (helm-insert-completion-at-point
- (car (helm-dabbrev-info-limits helm-dabbrev--data))
- (cdr limits) it)
- ;; Move already tried candidates to end of list.
- (setq helm-dabbrev--cache (append (remove it helm-dabbrev--cache)
- (list it))))
- ;; If the length of candidates is only one when computed
- ;; that's mean the unique matched item have already been
- ;; inserted by the iterator, so no need to reinsert the old dabbrev,
- ;; just let helm exiting with "No expansion found".
- (let ((old-dabbrev (if (helm-dabbrev-info-p helm-dabbrev--data)
- (helm-dabbrev-info-dabbrev helm-dabbrev--data)
- dabbrev)))
- (unless (cdr (all-completions old-dabbrev helm-dabbrev--cache))
- (setq cycling-disabled-p t))
- ;; Iterator is now empty, reset dabbrev to initial value
- ;; and start helm completion.
- (unless cycling-disabled-p
- (setq dabbrev old-dabbrev
- limits (helm-dabbrev-info-limits helm-dabbrev--data))
- (setq helm-dabbrev--data nil)
- (delete-region (car limits) (point))
- (insert dabbrev))
- (with-helm-show-completion (car limits) (cdr limits)
- (helm :sources (helm-build-in-buffer-source "Dabbrev Expand"
- :data helm-dabbrev--cache
- :persistent-action 'ignore
- :persistent-help "DoNothing"
- :keymap helm-dabbrev-map
- :action 'helm-dabbrev-default-action)
- :buffer "*helm dabbrev*"
- :input (concat "^" dabbrev " ")
- :resume 'noresume
- :allow-nest t)))))))
-
-(provide 'helm-dabbrev)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-dabbrev.el ends here
+++ /dev/null
-;;; helm-easymenu.el --- Helm easymenu definitions. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'easymenu)
-
-(easy-menu-add-item
- nil '("Tools")
- '("Helm"
- ["Find any Files/Buffers" helm-multi-files t]
- ["Helm Everywhere (Toggle)" helm-mode t]
- ["Helm resume" helm-resume t]
- "----"
- ("Files"
- ["Find files" helm-find-files t]
- ["Recent Files" helm-recentf t]
- ["Locate" helm-locate t]
- ["Search Files with find" helm-find t]
- ["Bookmarks" helm-filtered-bookmarks t])
- ("Buffers"
- ["Find buffers" helm-buffers-list t])
- ("Commands"
- ["Emacs Commands" helm-M-x t]
- ["Externals Commands" helm-run-external-command t])
- ("Help"
- ["Helm Apropos" helm-apropos t])
- ("Info"
- ["Info at point" helm-info-at-point t]
- ["Emacs Manual index" helm-info-emacs t]
- ["Gnus Manual index" helm-info-gnus t]
- ["Helm documentation" helm-documentation t])
- ("Org"
- ["Org headlines in org agenda files" helm-org-agenda-files-headings t]
- ["Org headlines in buffer" helm-org-in-buffer-headings t])
- ("Elpa"
- ["Elisp packages" helm-list-elisp-packages t]
- ["Elisp packages no fetch" helm-list-elisp-packages-no-fetch t])
- ("Tools"
- ["Occur" helm-occur t]
- ["Grep" helm-do-grep t]
- ["Grep current directory with AG" helm-do-grep-ag t]
- ["Gid" helm-gid t]
- ["Etags" helm-etags-select t]
- ["Lisp complete at point" helm-lisp-completion-at-point t]
- ["Browse Kill ring" helm-show-kill-ring t]
- ["Browse register" helm-register t]
- ["Mark Ring" helm-all-mark-rings t]
- ["Regexp handler" helm-regexp t]
- ["Colors & Faces" helm-colors t]
- ["Show xfonts" helm-select-xfont t]
- ["Ucs Symbols" helm-ucs t]
- ["Imenu" helm-imenu t]
- ["Imenu all" helm-imenu-in-all-buffers t]
- ["Semantic or Imenu" helm-semantic-or-imenu t]
- ["Google Suggest" helm-google-suggest t]
- ["Eval expression" helm-eval-expression-with-eldoc t]
- ["Calcul expression" helm-calcul-expression t]
- ["Man pages" helm-man-woman t]
- ["Top externals process" helm-top t]
- ["Emacs internals process" helm-list-emacs-process t])
- "----"
- ["Preferred Options" helm-configuration t])
- "Spell Checking")
-
-(easy-menu-add-item nil '("Tools") '("----") "Spell Checking")
-
-
-(provide 'helm-easymenu)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-easymenu.el ends here
+++ /dev/null
-;;; helm-elisp-package.el --- helm interface for package.el -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'package)
-
-(defgroup helm-el-package nil
- "helm elisp packages."
- :group 'helm)
-
-(defcustom helm-el-package-initial-filter 'all
- "Show only installed, upgraded or all packages at startup."
- :group 'helm-el-package
- :type '(radio :tag "Initial filter for elisp packages"
- (const :tag "Show all packages" all)
- (const :tag "Show installed packages" installed)
- (const :tag "Show not installed packages" uninstalled)
- (const :tag "Show upgradable packages" upgrade)))
-
-;; internals vars
-(defvar helm-el-package--show-only 'all)
-(defvar helm-el-package--initialized-p nil)
-(defvar helm-el-package--tabulated-list nil)
-(defvar helm-el-package--upgrades nil)
-(defvar helm-el-package--removable-packages nil)
-
-(defun helm-el-package--init ()
- (when (null package-alist)
- (setq helm-el-package--show-only 'all))
- (when (fboundp 'package--removable-packages)
- (setq helm-el-package--removable-packages
- (package--removable-packages)))
- (save-selected-window
- (list-packages helm-el-package--initialized-p)
- (setq helm-el-package--initialized-p t)
- (message nil))
- (helm-init-candidates-in-buffer
- 'global
- (with-current-buffer (get-buffer "*Packages*")
- (setq helm-el-package--tabulated-list tabulated-list-entries)
- (buffer-string)))
- (setq helm-el-package--upgrades (helm-el-package-menu--find-upgrades))
- (if helm-force-updating-p
- (if helm-el-package--upgrades
- (message "%d package(s) can be upgraded, Refreshing packages list done"
- (length helm-el-package--upgrades))
- (message "Refreshing packages list done, no upgrades available"))
- (setq helm-el-package--show-only (if helm-el-package--upgrades
- 'upgrade
- helm-el-package-initial-filter)))
- (kill-buffer "*Packages*"))
-
-(defun helm-el-package-describe (candidate)
- (let ((id (get-text-property 0 'tabulated-list-id candidate)))
- (describe-package (if (fboundp 'package-desc-name)
- (package-desc-name id)
- (car id)))))
-
-(defun helm-el-package-visit-homepage (candidate)
- (let* ((id (get-text-property 0 'tabulated-list-id candidate))
- (pkg (if (fboundp 'package-desc-name) (package-desc-name id)
- (car id)))
- (desc (cadr (assoc pkg package-archive-contents)))
- (extras (package-desc-extras desc))
- (url (and (listp extras) (cdr-safe (assoc :url extras)))))
- (if (stringp url)
- (browse-url url)
- (message "Package %s has no homepage"
- (propertize (symbol-name pkg)
- 'face 'font-lock-keyword-face)))))
-
-(defun helm-el-run-visit-homepage ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-visit-homepage)))
-
-(defun helm-el-package-install-1 (pkg-list)
- (cl-loop with mkd = pkg-list
- for p in mkd
- for id = (get-text-property 0 'tabulated-list-id p)
- do (package-install
- (if (fboundp 'package-desc-name)
- (package-desc-name id)
- (car id)))
- collect (if (fboundp 'package-desc-full-name)
- id
- (car id))
- into installed-list
- finally do (progn
- (when (boundp 'package-selected-packages)
- (customize-save-variable
- 'package-selected-packages
- (append (mapcar 'package-desc-name installed-list)
- package-selected-packages)))
- (if (fboundp 'package-desc-full-name)
- (message (format "%d packages installed:\n(%s)"
- (length installed-list)
- (mapconcat #'package-desc-full-name
- installed-list ", ")))
- (message (format "%d packages installed:\n(%s)"
- (length installed-list)
- (mapconcat 'symbol-name installed-list ", ")))))))
-
-(defun helm-el-package-install (_candidate)
- (helm-el-package-install-1 (helm-marked-candidates)))
-
-(defun helm-el-run-package-install ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-install)))
-
-(defun helm-el-package-uninstall-1 (pkg-list)
- (cl-loop with mkd = pkg-list
- for p in mkd
- for id = (get-text-property 0 'tabulated-list-id p)
- do
- (condition-case-unless-debug err
- (with-no-warnings
- (if (fboundp 'package-desc-full-name)
- ;; emacs 24.4
- (package-delete id)
- ;; emacs 24.3
- (package-delete (symbol-name (car id))
- (package-version-join (cdr id)))))
- (error (message (cadr err))))
- unless (assoc (elt id 1) package-alist)
- collect (if (fboundp 'package-desc-full-name)
- id
- (cons (symbol-name (car id))
- (package-version-join (cdr id))))
- into delete-list
- finally do (if delete-list
- (if (fboundp 'package-desc-full-name)
- ;; emacs 24.4
- (message (format "%d packages deleted:\n(%s)"
- (length delete-list)
- (mapconcat #'package-desc-full-name
- delete-list ", ")))
- ;; emacs 24.3
- (message (format "%d packages deleted:\n(%s)"
- (length delete-list)
- (mapconcat (lambda (x)
- (concat (car x) "-" (cdr x)))
- delete-list ", ")))
- ;; emacs 24.3 doesn't update
- ;; its `package-alist' after deleting.
- (cl-loop for p in package-alist
- when (assq (symbol-name (car p)) delete-list)
- do (setq package-alist (delete p package-alist))))
- "No package deleted")))
-
-(defun helm-el-package-uninstall (_candidate)
- (helm-el-package-uninstall-1 (helm-marked-candidates)))
-
-(defun helm-el-run-package-uninstall ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-uninstall)))
-
-(defun helm-el-package-menu--find-upgrades ()
- (cl-loop for entry in helm-el-package--tabulated-list
- for pkg-desc = (car entry)
- for status = (package-desc-status pkg-desc)
- when (member status '("installed" "unsigned" "dependency"))
- collect pkg-desc
- into installed
- when (member status '("available" "new"))
- collect (cons (package-desc-name pkg-desc) pkg-desc)
- into available
- finally return
- (cl-loop for pkg in installed
- for avail-pkg = (assq (package-desc-name pkg) available)
- when (and avail-pkg
- (version-list-< (package-desc-version pkg)
- (package-desc-version
- (cdr avail-pkg))))
- collect avail-pkg)))
-
-(defun helm-el-package-upgrade-1 (pkg-list)
- (cl-loop for p in pkg-list
- for pkg-desc = (car p)
- for upgrade = (cdr (assq (package-desc-name pkg-desc)
- helm-el-package--upgrades))
- do
- (cond ((null upgrade)
- (ignore))
- ((equal pkg-desc upgrade)
- ;;Install.
- (package-install pkg-desc))
- (t
- ;; Delete.
- (if (boundp 'package-selected-packages)
- (with-no-warnings
- (package-delete pkg-desc t t))
- (package-delete pkg-desc))))))
-
-(defun helm-el-package-upgrade (_candidate)
- (helm-el-package-upgrade-1
- (cl-loop with pkgs = (helm-marked-candidates)
- for p in helm-el-package--tabulated-list
- for pkg = (car p)
- if (member (symbol-name (package-desc-name pkg)) pkgs)
- collect p)))
-
-(defun helm-el-run-package-upgrade ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-upgrade)))
-
-(defun helm-el-package-upgrade-all ()
- (if helm-el-package--upgrades
- (with-helm-display-marked-candidates
- helm-marked-buffer-name (mapcar (lambda (x) (symbol-name (car x)))
- helm-el-package--upgrades)
- (when (y-or-n-p "Upgrade all packages? ")
- (helm-el-package-upgrade-1 helm-el-package--tabulated-list)))
- (message "No packages to upgrade actually!")))
-
-(defun helm-el-package-upgrade-all-action (_candidate)
- (helm-el-package-upgrade-all))
-
-(defun helm-el-run-package-upgrade-all ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-upgrade-all-action)))
-
-(defun helm-el-package--transformer (candidates _source)
- (cl-loop for c in candidates
- for id = (get-text-property 0 'tabulated-list-id c)
- for name = (if (fboundp 'package-desc-name)
- (package-desc-name id)
- (car id))
- for installed-p = (assq name package-alist)
- for upgrade-p = (assq name helm-el-package--upgrades)
- for user-installed-p = (and (boundp 'package-selected-packages)
- (memq name package-selected-packages))
- do (when user-installed-p (put-text-property 0 2 'display "S " c))
- do (when (memq name helm-el-package--removable-packages)
- (put-text-property 0 2 'display "U " c)
- (put-text-property
- 2 (+ (length (symbol-name name)) 2)
- 'face 'font-lock-variable-name-face c))
- for cand = (cons c (car (split-string c)))
- when (or (and upgrade-p
- (eq helm-el-package--show-only 'upgrade))
- (and installed-p
- (eq helm-el-package--show-only 'installed))
- (and (not installed-p)
- (eq helm-el-package--show-only 'uninstalled))
- (eq helm-el-package--show-only 'all))
- collect cand))
-
-(defun helm-el-package-show-upgrade ()
- (interactive)
- (with-helm-alive-p
- (setq helm-el-package--show-only 'upgrade)
- (helm-update)))
-
-(defun helm-el-package-show-installed ()
- (interactive)
- (with-helm-alive-p
- (setq helm-el-package--show-only 'installed)
- (helm-update)))
-
-(defun helm-el-package-show-all ()
- (interactive)
- (with-helm-alive-p
- (setq helm-el-package--show-only 'all)
- (helm-update)))
-
-(defun helm-el-package-show-uninstalled ()
- (interactive)
- (with-helm-alive-p
- (setq helm-el-package--show-only 'uninstalled)
- (helm-update)))
-
-(defvar helm-el-package-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-I") 'helm-el-package-show-installed)
- (define-key map (kbd "M-O") 'helm-el-package-show-uninstalled)
- (define-key map (kbd "M-U") 'helm-el-package-show-upgrade)
- (define-key map (kbd "M-A") 'helm-el-package-show-all)
- (define-key map (kbd "C-c i") 'helm-el-run-package-install)
- (define-key map (kbd "C-c r") 'helm-el-run-package-reinstall)
- (define-key map (kbd "C-c d") 'helm-el-run-package-uninstall)
- (define-key map (kbd "C-c u") 'helm-el-run-package-upgrade)
- (define-key map (kbd "C-c U") 'helm-el-run-package-upgrade-all)
- (define-key map (kbd "C-c @") 'helm-el-run-visit-homepage)
- map))
-
-(defvar helm-source-list-el-package nil)
-(defclass helm-list-el-package-source (helm-source-in-buffer)
- ((init :initform 'helm-el-package--init)
- (get-line :initform 'buffer-substring)
- (filtered-candidate-transformer :initform 'helm-el-package--transformer)
- (action-transformer
- :initform
- (lambda (actions candidate)
- (let ((pkg-desc (get-text-property
- 0 'tabulated-list-id candidate))
- (acts (if helm-el-package--upgrades
- (append actions '(("Upgrade all packages"
- . helm-el-package-upgrade-all-action)))
- actions)))
- (cond ((and (package-installed-p (package-desc-name pkg-desc))
- (cdr (assq (package-desc-name pkg-desc)
- helm-el-package--upgrades)))
- (append '(("Upgrade package(s)" . helm-el-package-upgrade)
- ("Uninstall package(s)" . helm-el-package-uninstall)) acts))
- ((cdr (assq (package-desc-name pkg-desc)
- helm-el-package--upgrades))
- (append '(("Upgrade package(s)" . helm-el-package-upgrade)) acts))
- ((package-installed-p (package-desc-name pkg-desc))
- (append acts '(("Reinstall package(s)" . helm-el-package-reinstall)
- ("Uninstall package(s)" . helm-el-package-uninstall))))
- (t (append acts '(("Install packages(s)" . helm-el-package-install))))))))
- (help-message :initform 'helm-el-package-help-message)
- (keymap :initform helm-el-package-map)
- (update :initform 'helm-el-package--update)
- (candidate-number-limit :initform 9999)
- (action :initform '(("Describe package" . helm-el-package-describe)
- ("Visit homepage" . helm-el-package-visit-homepage)))))
-
-(defun helm-el-package--update ()
- (setq helm-el-package--initialized-p nil))
-
-(defun helm-el-package-reinstall (_pkg)
- (cl-loop for p in (helm-marked-candidates)
- for pkg-desc = (get-text-property 0 'tabulated-list-id p)
- for name = (package-desc-name pkg-desc)
- do (if (fboundp 'package-reinstall)
- (package-reinstall name)
- (package-delete pkg-desc)
- (package-install name))))
-
-(defun helm-el-run-package-reinstall ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-reinstall)))
-
-;;;###autoload
-(defun helm-list-elisp-packages (arg)
- "Preconfigured helm for listing and handling emacs packages."
- (interactive "P")
- (when arg (setq helm-el-package--initialized-p nil))
- (unless helm-source-list-el-package
- (setq helm-source-list-el-package
- (helm-make-source "list packages" 'helm-list-el-package-source)))
- (helm :sources 'helm-source-list-el-package
- :buffer "*helm list packages*"))
-
-;;;###autoload
-(defun helm-list-elisp-packages-no-fetch ()
- "Preconfigured helm for emacs packages.
-Same as `helm-list-elisp-packages' but don't fetch packages on remote."
- (interactive)
- (let ((helm-el-package--initialized-p t))
- (helm-list-elisp-packages nil)))
-
-(provide 'helm-elisp-package)
-
-;;; helm-elisp-package.el ends here
+++ /dev/null
-;;; helm-elisp.el --- Elisp symbols completion for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-types)
-(require 'helm-utils)
-(require 'helm-info)
-(require 'helm-eval)
-(require 'helm-files)
-(require 'advice)
-
-(declare-function 'helm-describe-function "helm-lib")
-(declare-function 'helm-describe-variable "helm-lib")
-(declare-function 'helm-describe-face "helm-lib")
-
-\f
-;;; Customizable values
-
-(defgroup helm-elisp nil
- "Elisp related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-turn-on-show-completion t
- "Display candidate in buffer while moving selection when non--nil."
- :group 'helm-elisp
- :type 'boolean)
-
-(defcustom helm-show-completion-use-special-display t
- "A special display will be used in Lisp completion if non--nil.
-All functions that are wrapped in macro `with-helm-show-completion'
-will be affected."
- :group 'helm-elisp
- :type 'boolean)
-
-(defcustom helm-show-completion-min-window-height 7
- "Minimum completion window height used in show completion.
-This is used in macro `with-helm-show-completion'."
- :group 'helm-elisp
- :type 'integer)
-
-(defcustom helm-lisp-quoted-function-list
- '(funcall apply mapc cl-mapc mapcar cl-mapcar
- callf callf2 cl-callf cl-callf2 fset
- fboundp fmakunbound symbol-function)
- "List of function where quoted function completion happen.
-e.g give only function names after \(funcall '."
- :group 'helm-elisp
- :type '(repeat (choice symbol)))
-
-(defcustom helm-lisp-unquoted-function-list
- '(function defadvice)
- "List of function where unquoted function completion happen.
-e.g give only function names after \(function ."
- :group 'helm-elisp
- :type '(repeat (choice symbol)))
-
-(defcustom helm-apropos-fuzzy-match nil
- "Enable fuzzy matching for `helm-apropos' when non-nil."
- :group 'helm-elisp
- :type 'boolean)
-
-(defcustom helm-lisp-fuzzy-completion nil
- "Enable fuzzy matching in emacs-lisp completion when non-nil.
-NOTE: This enable 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'."
- :group 'helm-elisp
- :type 'boolean)
-
-(defcustom helm-apropos-function-list '(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
- helm-def-source--helm-attributes)
- "A list of functions that build helm sources to use in `helm-apropos'."
- :group 'helm-elisp
- :type '(repeat (choice symbol)))
-
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-elisp-faces nil
- "Customize the appearance of helm-elisp."
- :prefix "helm-"
- :group 'helm-elisp
- :group 'helm-faces)
-
-(defface helm-lisp-show-completion
- '((t (:background "DarkSlateGray")))
- "Face used for showing candidates in `helm-lisp-completion'."
- :group 'helm-elisp-faces)
-
-(defface helm-lisp-completion-info
- '((t (:foreground "red")))
- "Face used for showing info in `helm-lisp-completion'."
- :group 'helm-elisp-faces)
-
-(defcustom helm-elisp-help-function
- 'helm-elisp-show-help
- "Function for displaying help for Lisp symbols."
- :group 'helm-elisp
- :type '(choice (function :tag "Open help for the symbol."
- helm-elisp-show-help)
- (function :tag "Show one liner in modeline."
- helm-elisp-show-doc-modeline)))
-
-\f
-;;; Show completion.
-;;
-;; Provide show completion with macro `with-helm-show-completion'.
-
-(defvar helm-show-completion-overlay nil)
-
-;; Called each time cursor move in helm-buffer.
-(defun helm-show-completion ()
- (with-helm-current-buffer
- (overlay-put helm-show-completion-overlay
- 'display (substring-no-properties
- (helm-get-selection)))))
-
-(defun helm-show-completion-init-overlay (beg end)
- (when (and helm-turn-on-show-completion beg end)
- (setq helm-show-completion-overlay (make-overlay beg end))
- (overlay-put helm-show-completion-overlay
- 'face 'helm-lisp-show-completion)))
-
-(defun helm-show-completion-display-function (buffer &rest _args)
- "A special resized helm window is used depending on position in BUFFER."
- (with-selected-window (selected-window)
- (if (window-dedicated-p)
- (helm-default-display-buffer buffer)
- (let* ((screen-size (+ (count-screen-lines (window-start) (point) t)
- 1 ; mode-line
- (if header-line-format 1 0))) ; header-line
- (def-size (- (window-height)
- helm-show-completion-min-window-height))
- (upper-height (max window-min-height (min screen-size def-size)))
- split-window-keep-point)
- (recenter -1)
- (set-window-buffer (if (active-minibuffer-window)
- (minibuffer-selected-window)
- (split-window nil upper-height
- helm-split-window-default-side))
- buffer)))))
-
-(defmacro with-helm-show-completion (beg end &rest body)
- "Show helm candidate in an overlay at point.
-BEG and END are the beginning and end position of the current completion
-in `helm-current-buffer'.
-BODY is an helm call where we want to enable show completion.
-If `helm-turn-on-show-completion' is nil just do nothing."
- (declare (indent 2) (debug t))
- `(let ((helm-move-selection-after-hook
- (and helm-turn-on-show-completion
- (append (list 'helm-show-completion)
- helm-move-selection-after-hook))))
- (with-helm-temp-hook 'helm-after-initialize-hook
- (with-helm-buffer
- (set (make-local-variable 'helm-display-function)
- (if helm-show-completion-use-special-display
- 'helm-show-completion-display-function
- 'helm-default-display-buffer))))
- (unwind-protect
- (progn
- (helm-show-completion-init-overlay ,beg ,end)
- ,@body)
- (when (and helm-turn-on-show-completion
- helm-show-completion-overlay
- (overlayp helm-show-completion-overlay))
- (delete-overlay helm-show-completion-overlay)))))
-
-\f
-;;; Lisp symbol completion.
-;;
-;;
-(defun helm-lisp-completion--predicate-at-point (beg)
- ;; Return a predicate for `all-completions'.
- (let ((fn-sym-p (lambda ()
- (or
- (and (eq (char-before) ?\ )
- (save-excursion
- (skip-syntax-backward " " (point-at-bol))
- (memq (symbol-at-point)
- helm-lisp-unquoted-function-list)))
- (and (eq (char-before) ?\')
- (save-excursion
- (forward-char -1)
- (eq (char-before) ?\#)))))))
- (save-excursion
- (goto-char beg)
- (if (or
- ;; Complete on all symbols in non--lisp modes (logs mail etc..)
- (not (memq major-mode '(emacs-lisp-mode
- lisp-interaction-mode
- inferior-emacs-lisp-mode)))
- (not (or (funcall fn-sym-p)
- (and (eq (char-before) ?\')
- (save-excursion
- (forward-char (if (funcall fn-sym-p) -2 -1))
- (skip-syntax-backward " " (point-at-bol))
- (memq (symbol-at-point)
- helm-lisp-quoted-function-list)))
- (eq (char-before) ?\())) ; no paren before str.
- ;; Looks like we are in a let statement.
- (condition-case nil
- (progn (up-list -2) (forward-char 1)
- (eq (char-after) ?\())
- (error nil)))
- (lambda (sym)
- (or (boundp sym) (fboundp sym) (symbol-plist sym)))
- #'fboundp))))
-
-(defun helm-thing-before-point (&optional limits regexp)
- "Return symbol name before point.
-If REGEXP is specified return what REGEXP find before point.
-By default match the beginning of symbol before point.
-With LIMITS arg specified return the beginning and end position
-of symbol before point."
- (save-excursion
- (let (beg
- (end (point))
- (boundary (field-beginning nil nil (point-at-bol))))
- (if (re-search-backward (or regexp "\\_<") boundary t)
- (setq beg (match-end 0))
- (setq beg boundary))
- (unless (= beg end)
- (if limits
- (cons beg end)
- (buffer-substring-no-properties beg end))))))
-
-(defun helm-bounds-of-thing-before-point (&optional regexp)
- "Get the beginning and end position of `helm-thing-before-point'.
-Return a cons \(beg . end\)."
- (helm-thing-before-point 'limits regexp))
-
-(defun helm-insert-completion-at-point (beg end str)
- ;; When there is no space after point
- ;; we are completing inside a symbol or
- ;; after a partial symbol with the next arg aside
- ;; without space, in this case mark the region.
- ;; deleting it would remove the
- ;; next arg which is unwanted.
- (delete-region beg end)
- (insert str)
- (let ((pos (cdr (or (bounds-of-thing-at-point 'symbol)
- ;; needed for helm-dabbrev.
- (bounds-of-thing-at-point 'filename)))))
- (when (and pos (< (point) pos))
- (push-mark pos t t))))
-
-(defvar helm-lisp-completion--cache nil)
-(defvar helm-lgst-len nil)
-;;;###autoload
-(defun helm-lisp-completion-at-point ()
- "Preconfigured helm for lisp symbol completion at point."
- (interactive)
- (setq helm-lgst-len 0)
- (let* ((target (helm-thing-before-point))
- (beg (car (helm-bounds-of-thing-before-point)))
- (end (point))
- (pred (and beg (helm-lisp-completion--predicate-at-point beg)))
- (loc-vars (and (fboundp 'elisp--local-variables)
- (ignore-errors
- (mapcar #'symbol-name (elisp--local-variables)))))
- (glob-syms (and target pred (all-completions target obarray pred)))
- (candidates (append loc-vars glob-syms))
- (helm-quit-if-no-candidate t)
- (helm-execute-action-at-once-if-one t)
- (enable-recursive-minibuffers t))
- (setq helm-lisp-completion--cache (cl-loop for sym in candidates
- for len = (length sym)
- when (> len helm-lgst-len)
- do (setq helm-lgst-len len)
- collect sym))
- (if candidates
- (with-helm-show-completion beg end
- ;; Overlay is initialized now in helm-current-buffer.
- (helm
- :sources (helm-build-in-buffer-source "Lisp completion"
- :data helm-lisp-completion--cache
- :persistent-action 'helm-lisp-completion-persistent-action
- :nomark t
- :fuzzy-match helm-lisp-fuzzy-completion
- :persistent-help (helm-lisp-completion-persistent-help)
- :filtered-candidate-transformer
- 'helm-lisp-completion-transformer
- :action `(lambda (candidate)
- (with-helm-current-buffer
- (run-with-timer
- 0.01 nil
- 'helm-insert-completion-at-point
- ,beg ,end candidate))))
- :input (if helm-lisp-fuzzy-completion
- target (concat target " "))
- :resume 'noresume
- :buffer "*helm lisp completion*"
- :allow-nest t))
- (message "[No Match]"))))
-
-(defun helm-lisp-completion-persistent-action (candidate &optional name)
- "Show documentation for the function.
-Documentation is shown briefly in mode-line or completely
-in other window according to the value of `helm-elisp-help-function'."
- (funcall helm-elisp-help-function candidate name))
-
-(defun helm-lisp-completion-persistent-help ()
- "Return persistent-help according to the value of `helm-elisp-help-function'"
- (cl-ecase helm-elisp-help-function
- (helm-elisp-show-doc-modeline "Show brief doc in mode-line")
- (helm-elisp-show-help "Toggle show help for the symbol")))
-
-(defun helm-elisp--show-help-1 (candidate &optional name)
- (let ((sym (intern-soft candidate)))
- (cl-typecase sym
- ((and fboundp boundp)
- (if (member name '("describe-function" "describe-variable"))
- (funcall (intern (format "helm-%s" name)) sym)
- ;; When there is no way to know what to describe
- ;; prefer describe-function.
- (helm-describe-function sym)))
- (fboundp (helm-describe-function sym))
- (bound (helm-describe-variable sym))
- (face (helm-describe-face sym)))))
-
-(defun helm-elisp-show-help (candidate &optional name)
- "Show full help for the function CANDIDATE.
-Arg NAME specify the name of the top level function
-calling helm generic completion (e.g \"describe-function\")."
- (helm-elisp--persistent-help
- candidate 'helm-elisp--show-help-1 name))
-
-(defun helm-elisp-show-doc-modeline (candidate &optional name)
- "Show brief documentation for the function in modeline."
- (let ((cursor-in-echo-area t)
- mode-line-in-non-selected-windows)
- (helm-show-info-in-mode-line
- (propertize
- (helm-get-first-line-documentation
- (intern candidate) name)
- 'face 'helm-lisp-completion-info))))
-
-(defun helm-lisp-completion-transformer (candidates _source)
- "Helm candidates transformer for lisp completion."
- (cl-loop for c in candidates
- for sym = (intern c)
- for annot = (cl-typecase sym
- (command " (Com)")
- (class " (Class)")
- (generic " (Gen)")
- (fbound " (Fun)")
- (bound " (Var)")
- (face " (Face)"))
- for spaces = (make-string (- helm-lgst-len (length c)) ? )
- collect (cons (concat c spaces annot) c) into lst
- finally return (sort lst #'helm-generic-sort-fn)))
-
-(defun helm-get-first-line-documentation (sym &optional name)
- "Return first line documentation of symbol SYM.
-If SYM is not documented, return \"Not documented\"."
- (let ((doc (cl-typecase sym
- ((and fboundp boundp)
- (cond ((string= name "describe-function")
- (documentation sym t))
- ((string= name "describe-variable")
- (documentation-property sym 'variable-documentation t))
- (t (documentation sym t))))
- (fbound (documentation sym t))
- (bound (documentation-property sym 'variable-documentation t))
- (face (face-documentation sym)))))
- (if (and doc (not (string= doc ""))
- ;; `documentation' return "\n\n(args...)"
- ;; for CL-style functions.
- (not (string-match-p "^\n\n" doc)))
- (car (split-string doc "\n"))
- "Not documented")))
-
-;;; File completion.
-;;
-;; Complete file name at point.
-
-;;;###autoload
-(defun helm-complete-file-name-at-point (&optional force)
- "Preconfigured helm to complete file name at point."
- (interactive)
- (require 'helm-mode)
- (let* ((tap (thing-at-point 'filename))
- beg
- (init (and tap
- (or force
- (save-excursion
- (end-of-line)
- (search-backward tap (point-at-bol) t)
- (setq beg (point))
- (looking-back "[^'`( ]" (1- (point)))))
- (expand-file-name
- (substring-no-properties tap))))
- (end (point))
- (helm-quit-if-no-candidate t)
- (helm-execute-action-at-once-if-one t)
- completion)
- (with-helm-show-completion beg end
- (setq completion (helm-read-file-name "FileName: "
- :initial-input init)))
- (when (and completion (not (string= completion "")))
- (delete-region beg end) (insert (if (string-match "^~" tap)
- (abbreviate-file-name completion)
- completion)))))
-
-;;;###autoload
-(defun helm-lisp-indent ()
- ;; It is meant to use with `helm-define-multi-key' which
- ;; does not support args for functions yet, so use `current-prefix-arg'
- ;; for now instead of (interactive "P").
- (interactive)
- (let ((tab-always-indent (or (eq tab-always-indent 'complete)
- tab-always-indent)))
- (indent-for-tab-command current-prefix-arg)))
-
-;;;###autoload
-(defun helm-lisp-completion-or-file-name-at-point ()
- "Preconfigured helm to complete lisp symbol or filename at point.
-Filename completion happen if string start after or between a double quote."
- (interactive)
- (let* ((tap (thing-at-point 'filename)))
- (if (and tap (save-excursion
- (end-of-line)
- (search-backward tap (point-at-bol) t)
- (looking-back "[^'`( ]" (1- (point)))))
- (helm-complete-file-name-at-point)
- (helm-lisp-completion-at-point))))
-
-\f
-;;; Apropos
-;;
-;;
-(defun helm-apropos-init (test default)
- "Init candidates buffer for `helm-apropos' sources."
- (require 'helm-help)
- (helm-init-candidates-in-buffer 'global
- (let ((default-symbol (and (stringp default)
- (intern-soft default)))
- (symbols (all-completions "" obarray test)))
- (if (and default-symbol (funcall test default-symbol))
- (cons default-symbol symbols)
- symbols))))
-
-(defun helm-apropos-init-faces (default)
- "Init candidates buffer for faces for `helm-apropos'."
- (require 'helm-help)
- (with-current-buffer (helm-candidate-buffer 'global)
- (goto-char (point-min))
- (let ((default-symbol (and (stringp default)
- (intern-soft default)))
- (faces (face-list)))
- (when (and default-symbol (facep default-symbol))
- (insert (concat default "\n")))
- (insert
- (mapconcat #'prin1-to-string
- (if default
- (cl-remove-if (lambda (sym) (string= sym default)) faces)
- faces)
- "\n")))))
-
-(defun helm-apropos-default-sort-fn (candidates _source)
- (if (string= helm-pattern "")
- candidates
- (sort candidates #'helm-generic-sort-fn)))
-
-(defun helm-def-source--emacs-variables (&optional default)
- (helm-build-in-buffer-source "Variables"
- :init `(lambda ()
- (helm-apropos-init
- (lambda (x) (and (boundp x) (not (keywordp x)))) ,default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
- 'helm-apropos-default-sort-fn)
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-variable))
- :persistent-help "Describe variable"
- :action '(("Describe variable" . helm-describe-variable)
- ("Find variable" . helm-find-variable)
- ("Info lookup" . helm-info-lookup-symbol)
- ("Set variable" . helm-set-variable))
- :action-transformer
- (lambda (actions candidate)
- (let ((sym (helm-symbolify candidate)))
- (if (custom-variable-p sym)
- (append
- actions
- (let ((standard-value (eval (car (get sym 'standard-value)))))
- (unless (equal standard-value (symbol-value sym))
- `(("Reset Variable to default value" .
- ,(lambda (candidate)
- (let ((sym (helm-symbolify candidate)))
- (set sym standard-value)))))))
- '(("Customize variable" .
- (lambda (candidate)
- (customize-option (helm-symbolify candidate))))))
- actions)))))
-
-(defun helm-def-source--emacs-faces (&optional default)
- "Create `helm' source for faces to be displayed with
-`helm-apropos'."
- (helm-build-in-buffer-source "Faces"
- :init (lambda () (helm-apropos-init-faces default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer
- (append (and (null helm-apropos-fuzzy-match)
- '(helm-apropos-default-sort-fn))
- (list
- (lambda (candidates _source)
- (cl-loop for c in candidates
- collect (propertize c 'face (intern c))))))
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-face))
- :persistent-help "Describe face"
- :nomark t
- :action '(("Describe face" . helm-describe-face)
- ("Find face" . helm-find-face-definition)
- ("Customize face" . (lambda (candidate)
- (customize-face (helm-symbolify candidate)))))))
-
-(defun helm-def-source--helm-attributes (&optional _default)
- (let ((def-act (lambda (candidate)
- (let (special-display-buffer-names
- special-display-regexps
- helm-persistent-action-use-special-display)
- (with-output-to-temp-buffer "*Help*"
- (princ (get (intern candidate) 'helm-attrdoc)))))))
- (helm-build-sync-source "Helm attributes"
- :candidates (lambda ()
- (mapcar 'symbol-name helm-attributes))
- :fuzzy-match helm-apropos-fuzzy-match
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate def-act))
- :persistent-help "Describe helm attribute"
- :action def-act)))
-
-(defun helm-def-source--emacs-commands (&optional default)
- (helm-build-in-buffer-source "Commands"
- :init `(lambda ()
- (helm-apropos-init 'commandp ,default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
- 'helm-apropos-default-sort-fn)
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe command"
- :action '(("Describe function" . helm-describe-function)
- ("Find function" . helm-find-function)
- ("Info lookup" . helm-info-lookup-symbol))))
-
-(defun helm-def-source--emacs-functions (&optional default)
- (helm-build-in-buffer-source "Functions"
- :init `(lambda ()
- (helm-apropos-init (lambda (x)
- (and (fboundp x)
- (not (commandp x))
- (not (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)
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe function"
- :nomark t
- :action '(("Describe function" . helm-describe-function)
- ("Find function" . helm-find-function)
- ("Info lookup" . helm-info-lookup-symbol))))
-
-(defun helm-def-source--eieio-classes (&optional default)
- (helm-build-in-buffer-source "Classes"
- :init `(lambda ()
- (helm-apropos-init (lambda (x)
- (class-p x))
- ,default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
- 'helm-apropos-default-sort-fn)
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe class"
- :action '(("Describe function" . helm-describe-function)
- ("Find function" . helm-find-function)
- ("Info lookup" . helm-info-lookup-symbol))))
-
-(defun helm-def-source--eieio-generic (&optional default)
- (helm-build-in-buffer-source "Generic functions"
- :init `(lambda ()
- (helm-apropos-init (lambda (x)
- (generic-p x))
- ,default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
- 'helm-apropos-default-sort-fn)
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe generic function"
- :action '(("Describe function" . helm-describe-function)
- ("Find function" . helm-find-function)
- ("Info lookup" . helm-info-lookup-symbol))))
-
-(defun helm-info-lookup-symbol-1 (c)
- (let ((helm-execute-action-at-once-if-one t)
- (helm-quit-if-no-candidate
- `(lambda ()
- (message "`%s' Not Documented as a symbol" ,c))))
- (helm :sources '(helm-source-info-elisp
- helm-source-info-cl
- helm-source-info-eieio)
- :resume 'noresume
- :buffer "*helm lookup*"
- :input c)))
-
-(defun helm-info-lookup-symbol (candidate)
- (run-with-timer 0.01 nil #'helm-info-lookup-symbol-1 candidate))
-
-(defun helm-elisp--persistent-help (candidate fun &optional name)
- (let ((hbuf (get-buffer (help-buffer))))
- (if (and (helm-attr 'help-running-p)
- (string= candidate (helm-attr 'help-current-symbol))
- (null helm-persistent-action-use-special-display))
- (progn
- ;; When started from a help buffer,
- ;; Don't kill this buffer as it is helm-current-buffer.
- (unless (equal hbuf helm-current-buffer)
- (kill-buffer hbuf)
- (set-window-buffer (get-buffer-window hbuf)
- helm-current-buffer))
- (helm-attrset 'help-running-p nil))
- (if name (funcall fun candidate name) (funcall fun candidate))
- (helm-attrset 'help-running-p t))
- (helm-attrset 'help-current-symbol candidate)))
-
-;;;###autoload
-(defun helm-apropos ()
- "Preconfigured helm to describe commands, functions, variables and faces."
- (interactive)
- (let ((default (thing-at-point 'symbol)))
- (helm :sources
- (mapcar (lambda (func)
- (funcall func default))
- helm-apropos-function-list)
- :buffer "*helm apropos*"
- :preselect (and default (concat "\\_<" (regexp-quote default) "\\_>")))))
-
-\f
-;;; Advices
-;;
-;;
-(defvar helm-source-advice
- '((name . "Function Advice")
- (candidates . helm-advice-candidates)
- (action ("Toggle Enable/Disable" . helm-advice-toggle))
- (persistent-action . helm-advice-persistent-action)
- (nomark)
- (multiline)
- (persistent-help . "Describe function / C-u C-j: Toggle advice")))
-
-(defun helm-advice-candidates ()
- (cl-loop for (fname) in ad-advised-functions
- for function = (intern fname)
- append
- (cl-loop for class in ad-advice-classes append
- (cl-loop for advice in (ad-get-advice-info-field function class)
- for enabled = (ad-advice-enabled advice)
- collect
- (cons (format
- "%s %s %s"
- (if enabled "Enabled " "Disabled")
- (propertize fname 'face 'font-lock-function-name-face)
- (ad-make-single-advice-docstring advice class nil))
- (list function class advice))))))
-
-(defun helm-advice-persistent-action (func-class-advice)
- (if current-prefix-arg
- (helm-advice-toggle func-class-advice)
- (describe-function (car func-class-advice))))
-
-(defun helm-advice-toggle (func-class-advice)
- (cl-destructuring-bind (function _class advice) func-class-advice
- (cond ((ad-advice-enabled advice)
- (ad-advice-set-enabled advice nil)
- (message "Disabled"))
- (t
- (ad-advice-set-enabled advice t)
- (message "Enabled")))
- (ad-activate function)
- (and helm-in-persistent-action
- (helm-advice-update-current-display-string))))
-
-(defun helm-advice-update-current-display-string ()
- (helm-edit-current-selection
- (let ((newword (cond ((looking-at "Disabled") "Enabled")
- ((looking-at "Enabled") "Disabled"))))
- (when newword
- (delete-region (point) (progn (forward-word 1) (point)))
- (insert newword)))))
-
-;;;###autoload
-(defun helm-manage-advice ()
- "Preconfigured `helm' to disable/enable function advices."
- (interactive)
- (helm-other-buffer 'helm-source-advice "*helm advice*"))
-
-\f
-;;; Locate elisp library
-;;
-;;
-(defun helm-locate-library-scan-list ()
- (cl-loop for dir in load-path
- when (file-directory-p dir)
- append (directory-files dir t (concat (regexp-opt (get-load-suffixes))
- "\\'"))
- into lst
- finally return (helm-fast-remove-dups lst :test 'equal)))
-
-;;;###autoload
-(defun helm-locate-library ()
- "Preconfigured helm to locate elisp libraries."
- (interactive)
- (helm :sources (helm-build-in-buffer-source "Elisp libraries (Scan)"
- :data (lambda () (helm-locate-library-scan-list))
- :fuzzy-match t
- :keymap helm-generic-files-map
- :match-part (lambda (candidate)
- (if helm-ff-transformer-show-only-basename
- (helm-basename candidate) candidate))
- :filter-one-by-one (lambda (c)
- (if helm-ff-transformer-show-only-basename
- (cons (helm-basename c) c) c))
- :action (helm-actions-from-type-file))
- :buffer "*helm locate library*"))
-
-(defun helm-set-variable (var)
- "Set value to VAR interactively."
- (let* ((sym (helm-symbolify var))
- (val (default-value sym)))
- (set-default sym (eval-minibuffer (format "Set `%s': " var)
- (if (or (stringp val) (memq val '(nil t)))
- (prin1-to-string val)
- (format "'%s" (prin1-to-string val)))))))
-
-\f
-;;; Elisp Timers.
-;;
-;;
-(defclass helm-absolute-time-timers-class (helm-source-sync helm-type-timers)
- ((candidates :initform timer-list)
- (allow-dups :initform t)
- (candidate-transformer
- :initform
- (lambda (candidates)
- (cl-loop for timer in candidates
- collect (cons (helm-elisp--format-timer timer) timer))))))
-
-(defvar helm-source-absolute-time-timers
- (helm-make-source "Absolute Time Timers" 'helm-absolute-time-timers-class))
-
-(defclass helm-idle-time-timers-class (helm-source-sync helm-type-timers)
- ((candidates :initform timer-idle-list)
- (allow-dups :initform t)
- (candidate-transformer
- :initform
- (lambda (candidates)
- (cl-loop for timer in candidates
- collect (cons (helm-elisp--format-timer timer) timer))))))
-
-(defvar helm-source-idle-time-timers
- (helm-make-source "Idle Time Timers" 'helm-idle-time-timers-class))
-
-(defun helm-elisp--format-timer (timer)
- (format "%s repeat=%s %s(%s)"
- (let ((time (timer--time timer)))
- (if (timer--idle-delay timer)
- (format-time-string "idle-for=%5s" time)
- (format-time-string "%m/%d %T" time)))
- (or (timer--repeat-delay timer) "nil")
- (mapconcat 'identity (split-string
- (prin1-to-string (timer--function timer))
- "\n") " ")
- (mapconcat 'prin1-to-string (timer--args timer) " ")))
-
-;;;###autoload
-(defun helm-timers ()
- "Preconfigured `helm' for timers."
- (interactive)
- (helm :sources '(helm-source-absolute-time-timers
- helm-source-idle-time-timers)
- :buffer "*helm timers*"))
-
-\f
-;;; Complex command history
-;;
-;;
-(defun helm-btf--usable-p ()
- "Return t if current version of `backtrace-frame' accept 2 arguments."
- (condition-case nil
- (progn (backtrace-frame 1 'condition-case) t)
- (wrong-number-of-arguments nil)))
-
-(if (helm-btf--usable-p) ; Check if BTF accept more than one arg.
- ;; Emacs 24.4.
- (dont-compile
- (defvar helm-sexp--last-sexp nil)
- ;; This wont work compiled.
- (defun helm-sexp-eval-1 ()
- (interactive)
- (unwind-protect
- (progn
- ;; Trick called-interactively-p into thinking that `cand' is
- ;; an interactive call, See `repeat-complex-command'.
- (add-hook 'called-interactively-p-functions
- #'helm-complex-command-history--called-interactively-skip)
- (eval (read helm-sexp--last-sexp)))
- (remove-hook 'called-interactively-p-functions
- #'helm-complex-command-history--called-interactively-skip)))
-
- (defun helm-complex-command-history--called-interactively-skip (i _frame1 frame2)
- (and (eq 'eval (cadr frame2))
- (eq 'helm-sexp-eval-1
- (cadr (backtrace-frame (+ i 2) #'called-interactively-p)))
- 1))
-
- (defun helm-sexp-eval (_candidate)
- (call-interactively #'helm-sexp-eval-1)))
- ;; Emacs 24.3
- (defun helm-sexp-eval (cand)
- (let ((sexp (read cand)))
- (condition-case err
- (if (> (length (remove nil sexp)) 1)
- (eval sexp)
- (apply 'call-interactively sexp))
- (error (message "Evaluating gave an error: %S" err)
- nil)))))
-
-(defvar helm-source-complex-command-history
- (helm-build-sync-source "Complex Command History"
- :candidates (lambda ()
- ;; Use cdr to avoid adding
- ;; `helm-complex-command-history' here.
- (cl-loop for i in command-history
- unless (equal i '(helm-complex-command-history))
- collect (prin1-to-string i)))
- :action (helm-make-actions
- "Eval" (lambda (candidate)
- (and (boundp 'helm-sexp--last-sexp)
- (setq helm-sexp--last-sexp candidate))
- (run-with-timer 0.1 nil #'helm-sexp-eval candidate))
- "Edit and eval" (lambda (candidate)
- (edit-and-eval-command "Eval: " (read candidate))))
- :persistent-action #'helm-sexp-eval))
-
-;;;###autoload
-(defun helm-complex-command-history ()
- "Preconfigured helm for complex command history."
- (interactive)
- (helm :sources 'helm-source-complex-command-history
- :buffer "*helm complex commands*"))
-
-(provide 'helm-elisp)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-elisp.el ends here
+++ /dev/null
-;;; helm-elscreen.el -- Elscreen support -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-
-(declare-function elscreen-find-screen-by-buffer "ext:elscreen.el" (buffer &optional create))
-(declare-function elscreen-find-file "ext:elscreen.el" (filename))
-(declare-function elscreen-goto "ext:elscreen.el" (screen))
-(declare-function elscreen-get-conf-list "ext:elscreen.el" (type))
-
-(defun helm-find-buffer-on-elscreen (candidate)
- "Open buffer in new screen, if marked buffers open all in elscreens."
- (helm-require-or-error 'elscreen 'helm-find-buffer-on-elscreen)
- (helm-aif (helm-marked-candidates)
- (cl-dolist (i it)
- (let ((target-screen (elscreen-find-screen-by-buffer
- (get-buffer i) 'create)))
- (elscreen-goto target-screen)))
- (let ((target-screen (elscreen-find-screen-by-buffer
- (get-buffer candidate) 'create)))
- (elscreen-goto target-screen))))
-
-(defun helm-elscreen-find-file (file)
- (helm-require-or-error 'elscreen 'helm-elscreen-find-file)
- (elscreen-find-file file))
-
-(defclass helm-source-elscreen (helm-source-sync)
- ((candidates
- :initform
- (lambda ()
- (when (cdr (elscreen-get-screen-to-name-alist))
- (cl-sort (cl-loop for (screen . name) in (elscreen-get-screen-to-name-alist)
- collect (cons (format "[%d] %s" screen name) screen))
- #'< :key #'cdr))))
- (action :initform
- '(("Change Screen" .
- (lambda (candidate)
- (elscreen-goto candidate)))
- ("Kill Screen(s)" .
- (lambda (_)
- (cl-dolist (i (helm-marked-candidates))
- (elscreen-goto i)
- (elscreen-kill))))
- ("Only Screen" .
- (lambda (candidate)
- (elscreen-goto candidate)
- (elscreen-kill-others)))))
- (migemo :initform t)))
-
-(defclass helm-source-elscreen-history (helm-source-elscreen)
- ((candidates
- :initform
- (lambda ()
- (let ((sname (elscreen-get-screen-to-name-alist)))
- (when (cdr sname)
- (cl-loop for screen in (cdr (elscreen-get-conf-list 'screen-history))
- collect (cons (format "[%d] %s" screen (cdr (assq screen sname)))
- screen))))))))
-
-(defvar helm-source-elscreen-list
- (helm-make-source "ElScreen" 'helm-source-elscreen))
-
-(defvar helm-source-elscreen-history-list
- (helm-make-source "ElScreen History" 'helm-source-elscreen-history))
-
-;;;###autoload
-(defun helm-elscreen ()
- "Preconfigured helm to list elscreen."
- (interactive)
- (helm-other-buffer 'helm-source-elscreen-list "*Helm ElScreen*"))
-
-;;;###autoload
-(defun helm-elscreen-history ()
- "Preconfigured helm to list elscreen in history order."
- (interactive)
- (helm-other-buffer 'helm-source-elscreen-history-list "*Helm ElScreen*"))
-
-(provide 'helm-elscreen)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-elscreen.el ends here
+++ /dev/null
-;;; helm-eshell.el --- pcomplete and eshell completion for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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/>.
-
-;;; Commentary:
-;;
-;; Enable like this in .emacs:
-;; (add-hook 'eshell-mode-hook
-;; (lambda ()
-;; (eshell-cmpl-initialize)
-;; (define-key eshell-mode-map [remap pcomplete] 'helm-esh-pcomplete)
-;; (define-key eshell-mode-map (kbd "M-p") 'helm-eshell-history)))
-
-
-;;; Code:
-(require 'cl-lib)
-(require 'helm)
-(require 'helm-lib)
-(require 'helm-help)
-(require 'helm-elisp)
-
-(declare-function eshell-read-aliases-list "em-alias")
-(declare-function eshell-send-input "esh-mode" (&optional use-region queue-p no-newline))
-(declare-function eshell-bol "esh-mode")
-(declare-function eshell-parse-arguments "esh-arg" (beg end))
-(declare-function eshell-backward-argument "esh-mode" (&optional arg))
-(declare-function helm-quote-whitespace "helm-lib")
-
-\f
-(defgroup helm-eshell nil
- "Helm eshell completion and history."
- :group 'helm)
-
-(defcustom helm-eshell-hist-ignoredups nil
- "Same as `eshell-hist-ignoredups' which see but for helm."
- :group 'helm-eshell
- :type 'boolean)
-
-\f
-(defvar helm-eshell-history-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-p") 'helm-next-line)
- map)
- "Keymap for `helm-eshell-history'.")
-
-(defvar helm-esh-completion-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "TAB") 'helm-next-line)
- map)
- "Keymap for `helm-esh-pcomplete'.")
-
-\f
-(defclass helm-esh-source (helm-source-sync)
- ((init :initform (lambda ()
- (setq pcomplete-current-completions nil
- pcomplete-last-completion-raw nil)
- ;; Eshell-command add this hook in all minibuffers
- ;; Remove it for the helm one. (Fixed in Emacs24)
- (remove-hook 'minibuffer-setup-hook 'eshell-mode)))
- (candidates :initform 'helm-esh-get-candidates)
- (nomark :initform t)
- (persistent-action :initform 'ignore)
- (filtered-candidate-transformer
- :initform
- (lambda (candidates _sources)
- (cl-loop
- for i in candidates
- collect
- (cond ((string-match "\\`~/?" helm-ec-target)
- (abbreviate-file-name i))
- ((string-match "\\`/" helm-ec-target) i)
- (t
- (file-relative-name i)))
- into lst
- finally return (sort lst 'helm-generic-sort-fn))))
- (action :initform 'helm-ec-insert))
- "Helm class to define source for Eshell completion.")
-
-;; Internal.
-(defvar helm-ec-target "")
-(defun helm-ec-insert (candidate)
- "Replace text at point with CANDIDATE.
-The function that call this should set `helm-ec-target' to thing at point."
- (let ((pt (point)))
- (when (and helm-ec-target
- (search-backward helm-ec-target nil t)
- (string= (buffer-substring (point) pt) helm-ec-target))
- (delete-region (point) pt)))
- (when (string-match "\\`\\*" helm-ec-target) (insert "*"))
- (cond ((string-match "\\`~/?" helm-ec-target)
- (insert (helm-quote-whitespace (abbreviate-file-name candidate))))
- ((string-match "\\`/" helm-ec-target)
- (insert (helm-quote-whitespace candidate)))
- (t
- (insert (concat (and (string-match "\\`[.]/" helm-ec-target) "./")
- (helm-quote-whitespace
- (file-relative-name candidate)))))))
-
-(defun helm-esh-get-candidates ()
- "Get candidates for eshell completion using `pcomplete'."
- (catch 'pcompleted
- (with-helm-current-buffer
- (let* ((pcomplete-stub)
- pcomplete-seen pcomplete-norm-func
- pcomplete-args pcomplete-last pcomplete-index
- (pcomplete-autolist pcomplete-autolist)
- (pcomplete-suffix-list pcomplete-suffix-list)
- (table (pcomplete-completions))
- (entry (or (try-completion helm-pattern
- (pcomplete-entries))
- helm-pattern)))
- (cl-loop ;; expand entry too to be able to compare it with file-cand.
- with exp-entry = (and (stringp entry)
- (not (string= entry ""))
- (file-name-as-directory
- (expand-file-name entry default-directory)))
- for i in (all-completions pcomplete-stub table)
- ;; Transform the related names to abs names.
- for file-cand = (and exp-entry
- (if (file-remote-p i) i
- (expand-file-name
- i (file-name-directory entry))))
- ;; Compare them to avoid dups.
- for file-entry-p = (and (stringp exp-entry)
- (stringp file-cand)
- ;; Fix :/tmp/foo/ $ cd foo
- (not (file-directory-p file-cand))
- (file-equal-p exp-entry file-cand))
- if (and file-cand (or (file-remote-p file-cand)
- (file-exists-p file-cand))
- (not file-entry-p))
- collect file-cand into ls
- else
- ;; Avoid adding entry here.
- unless file-entry-p collect i into ls
- finally return
- (if (and exp-entry
- (file-directory-p exp-entry)
- ;; If the car of completion list is
- ;; an executable, probably we are in
- ;; command completion, so don't add a
- ;; possible file related entry here.
- (and ls (not (executable-find (car ls))))
- ;; Don't add entry if already in prompt.
- (not (file-equal-p exp-entry pcomplete-stub)))
- (append (list exp-entry)
- ;; Entry should not be here now but double check.
- (remove entry ls))
- ls))))))
-\f
-;;; Eshell history.
-;;
-;;
-(defclass helm-eshell-history-source (helm-source-in-buffer)
- ((init :initform
- (lambda ()
- (let ((eshell-hist-ignoredups helm-eshell-hist-ignoredups))
- (eshell-write-history eshell-history-file-name t)
- (with-current-buffer (helm-candidate-buffer 'global)
- (insert-file-contents eshell-history-file-name)))
- ;; Same comment as in `helm-source-esh'
- (remove-hook 'minibuffer-setup-hook 'eshell-mode)))
- (nomark :initform t)
- (keymap :initform helm-eshell-history-map)
- (filtered-candidate-transformer :initform (lambda (candidates sources)
- (reverse candidates)))
- (candidate-number-limit :initform 9999)
- (action :initform (lambda (candidate)
- (eshell-kill-input)
- (insert candidate))))
- "Helm class to define source for Eshell history.")
-
-\f
-;;;###autoload
-(defun helm-esh-pcomplete ()
- "Preconfigured helm to provide helm completion in eshell."
- (interactive)
- (let* ((helm-quit-if-no-candidate t)
- (helm-execute-action-at-once-if-one t)
- (end (point-marker))
- (beg (save-excursion (eshell-bol) (point)))
- (args (catch 'eshell-incomplete
- (eshell-parse-arguments beg end)))
- (target
- (or (and (looking-back " " (1- (point))) " ")
- (buffer-substring-no-properties
- (save-excursion
- (eshell-backward-argument 1) (point))
- end)))
- (first (car args)) ; Maybe lisp delimiter "(".
- last ; Will be the last but parsed by pcomplete.
- del-space)
- (setq helm-ec-target (or target " ")
- end (point)
- ;; Reset beg for `with-helm-show-completion'.
- beg (or (and target (not (string= target " "))
- (- end (length target)))
- ;; Nothing at point.
- (progn (insert " ") (setq del-space t) (point))))
- (cond ((eq first ?\()
- (helm-lisp-completion-or-file-name-at-point))
- ;; In eshell `pcomplete-parse-arguments' is called
- ;; with `pcomplete-parse-arguments-function'
- ;; locally bound to `eshell-complete-parse-arguments'
- ;; which is calling `lisp-complete-symbol',
- ;; calling it before would popup the
- ;; *completions* buffer.
- (t (setq last (replace-regexp-in-string
- "\\`\\*" ""
- (car (last (ignore-errors
- (pcomplete-parse-arguments))))))
- (with-helm-show-completion beg end
- (or (helm :sources (helm-make-source "Eshell completions" 'helm-esh-source)
- :buffer "*helm pcomplete*"
- :keymap helm-esh-completion-map
- :resume 'noresume
- :input (and (stringp last)
- (helm-ff-set-pattern last)))
- (and del-space (looking-back "\\s-" (1- (point)))
- (delete-char -1))))))))
-
-;;;###autoload
-(defun helm-eshell-history ()
- "Preconfigured helm for eshell history."
- (interactive)
- (let* ((end (point))
- (beg (save-excursion (eshell-bol) (point)))
- (input (buffer-substring beg end))
- flag-empty)
- (when (eq beg end)
- (insert " ")
- (setq flag-empty t)
- (setq end (point)))
- (unwind-protect
- (with-helm-show-completion beg end
- (helm :sources (helm-make-source "Eshell history"
- 'helm-eshell-history-source)
- :buffer "*helm eshell history*"
- :resume 'noresume
- :input input))
- (when (and flag-empty
- (looking-back " " (1- (point))))
- (delete-char -1)))))
-
-(provide 'helm-eshell)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-eshell ends here
+++ /dev/null
-;;; helm-eval.el --- eval expressions from helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'eldoc)
-(require 'edebug)
-
-\f
-(defgroup helm-eval nil
- "Eval related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-eldoc-in-minibuffer-show-fn
- 'helm-show-info-in-mode-line
- "A function to display eldoc info.
-Should take one arg: the string to display."
- :group 'helm-eval
- :type 'symbol)
-
-(defcustom helm-show-info-in-mode-line-delay 12
- "Eldoc will show info in mode-line during this delay if user is idle."
- :type 'integer
- :group 'helm-eval)
-
-\f
-;;; Eldoc compatibility between emacs-24 and emacs-25
-;;
-(if (require 'elisp-mode nil t) ; emacs-25
- ;; Maybe the eldoc functions have been
- ;; already aliased by eldoc-eval.
- (cl-loop for (f . a) in '((eldoc-current-symbol .
- elisp--current-symbol)
- (eldoc-fnsym-in-current-sexp .
- elisp--fnsym-in-current-sexp)
- (eldoc-get-fnsym-args-string .
- elisp-get-fnsym-args-string)
- (eldoc-get-var-docstring .
- elisp-get-var-docstring))
- unless (fboundp f)
- do (defalias f a))
- ;; Emacs-24.
- (declare-function eldoc-current-symbol "eldoc")
- (declare-function eldoc-get-fnsym-args-string "eldoc" (sym &optional index))
- (declare-function eldoc-get-var-docstring "eldoc" (sym))
- (declare-function eldoc-fnsym-in-current-sexp "eldoc"))
-
-;;; Evaluation Result
-;;
-;;
-;; Internal
-(defvar helm-eldoc-active-minibuffers-list nil)
-
-(defvar helm-eval-expression-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "<C-return>") 'helm-eval-new-line-and-indent)
- (define-key map (kbd "<M-tab>") 'lisp-indent-line)
- (define-key map (kbd "<C-tab>") 'helm-lisp-completion-at-point)
- (define-key map (kbd "C-p") 'previous-line)
- (define-key map (kbd "C-n") 'next-line)
- (define-key map (kbd "<up>") 'previous-line)
- (define-key map (kbd "<down>") 'next-line)
- (define-key map (kbd "<right>") 'forward-char)
- (define-key map (kbd "<left>") 'backward-char)
- map))
-
-(defun helm-build-evaluation-result-source ()
- (helm-build-dummy-source "Evaluation Result"
- :multiline t
- :mode-line "C-RET: nl-and-indent, M-tab: reindent, C-tab:complete, C-p/n: next/prec-line."
- :filtered-candidate-transformer (lambda (_candidates _source)
- (list
- (condition-case nil
- (with-helm-current-buffer
- (pp-to-string
- (if edebug-active
- (edebug-eval-expression
- (read helm-pattern))
- (eval (read helm-pattern)))))
- (error "Error"))))
- :nohighlight t
- :action '(("Copy result to kill-ring" . (lambda (candidate)
- (kill-new
- (replace-regexp-in-string
- "\n" "" candidate))
- (message "Result copied to kill-ring")))
- ("copy sexp to kill-ring" . (lambda (_candidate)
- (kill-new helm-input)
- (message "Sexp copied to kill-ring"))))))
-
-(defun helm-eval-new-line-and-indent ()
- (interactive)
- (newline) (lisp-indent-line))
-
-(defun helm-eldoc-store-minibuffer ()
- "Store minibuffer buffer name in `helm-eldoc-active-minibuffers-list'."
- (with-selected-window (minibuffer-window)
- (push (current-buffer) helm-eldoc-active-minibuffers-list)))
-
-(defun helm-eldoc-show-in-eval ()
- "Return eldoc in mode-line for current minibuffer input."
- (let ((buf (window-buffer (active-minibuffer-window))))
- (condition-case err
- (when (member buf helm-eldoc-active-minibuffers-list)
- (with-current-buffer buf
- (let* ((sym (save-excursion
- (unless (looking-back ")\\|\"" (1- (point)))
- (forward-char -1))
- (eldoc-current-symbol)))
- (info-fn (eldoc-fnsym-in-current-sexp))
- (doc (or (eldoc-get-var-docstring sym)
- (eldoc-get-fnsym-args-string
- (car info-fn) (cadr info-fn)))))
- (when doc (funcall helm-eldoc-in-minibuffer-show-fn doc)))))
- (error (message "Eldoc in minibuffer error: %S" err) nil))))
-
-(defun helm-show-info-in-mode-line (str)
- "Display string STR in mode-line."
- (save-selected-window
- (with-current-buffer helm-buffer
- (let ((mode-line-format (concat " " str)))
- (force-mode-line-update)
- (sit-for helm-show-info-in-mode-line-delay))
- (force-mode-line-update))))
-
-;;; Calculation Result
-;;
-;;
-(defvar helm-source-calculation-result
- (helm-build-dummy-source "Calculation Result"
- :filtered-candidate-transformer (lambda (_candidates _source)
- (list
- (condition-case nil
- (calc-eval helm-pattern)
- (error "error"))))
- :nohighlight t
- :action '(("Copy result to kill-ring" . (lambda (candidate)
- (kill-new candidate)
- (message "Result \"%s\" copied to kill-ring"
- candidate)))
- ("Copy operation to kill-ring" . (lambda (_candidate)
- (kill-new helm-input)
- (message "Calculation copied to kill-ring"))))))
-
-;;;###autoload
-(defun helm-eval-expression (arg)
- "Preconfigured helm for `helm-source-evaluation-result'."
- (interactive "P")
- (helm :sources (helm-build-evaluation-result-source)
- :input (when arg (thing-at-point 'sexp))
- :buffer "*helm eval*"
- :echo-input-in-header-line nil
- :history 'read-expression-history
- :keymap helm-eval-expression-map))
-
-(defvar eldoc-idle-delay)
-;;;###autoload
-(defun helm-eval-expression-with-eldoc ()
- "Preconfigured helm for `helm-source-evaluation-result' with `eldoc' support. "
- (interactive)
- (let ((timer (run-with-idle-timer
- eldoc-idle-delay 'repeat
- 'helm-eldoc-show-in-eval)))
- (unwind-protect
- (minibuffer-with-setup-hook
- 'helm-eldoc-store-minibuffer
- (call-interactively 'helm-eval-expression))
- (and timer (cancel-timer timer))
- (setq helm-eldoc-active-minibuffers-list
- (cdr helm-eldoc-active-minibuffers-list)))))
-
-;;;###autoload
-(defun helm-calcul-expression ()
- "Preconfigured helm for `helm-source-calculation-result'."
- (interactive)
- (helm :sources 'helm-source-calculation-result
- :buffer "*helm calcul*"))
-
-(provide 'helm-eval)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-eval.el ends here
+++ /dev/null
-;;; helm-external.el --- Run Externals commands within Emacs with helm completion. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-net)
-
-\f
-(defgroup helm-external nil
- "External related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-raise-command 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\"."
- :type 'string
- :group 'helm-external)
-
-(defcustom helm-external-programs-associations nil
- "Alist to store externals programs associated with file extension.
-This variable overhide setting in .mailcap file.
-e.g : '\(\(\"jpg\" . \"gqview\"\) (\"pdf\" . \"xpdf\"\)\) "
- :type '(alist :key-type string :value-type string)
- :group 'helm-external)
-
-(defcustom helm-default-external-file-browser "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 external file browser
-or do not want to use it.
-Windows users should set that to \"explorer.exe\"."
- :group 'helm-external
- :type 'string)
-
-\f
-;;; Internals
-(defvar helm-external-command-history nil)
-(defvar helm-external-commands-list nil
- "A list of all external commands the user can execute.
-If this variable is not set by the user, it will be calculated
-automatically.")
-
-(defun helm-external-commands-list-1 (&optional sort)
- "Returns a list of all external commands the user can execute.
-If `helm-external-commands-list' is non-nil it will
-return its contents. Else it calculates all external commands
-and sets `helm-external-commands-list'."
- (helm-aif helm-external-commands-list
- it
- (setq helm-external-commands-list
- (cl-loop
- for dir in (split-string (getenv "PATH") path-separator)
- when (and (file-exists-p dir) (file-accessible-directory-p dir))
- for lsdir = (cl-loop for i in (directory-files dir t)
- for bn = (file-name-nondirectory i)
- when (and (not (member bn completions))
- (not (file-directory-p i))
- (file-executable-p i))
- collect bn)
- append lsdir into completions
- finally return
- (if sort (sort completions 'string-lessp) completions)))))
-
-(defun helm-run-or-raise (exe &optional file)
- "Generic command that run asynchronously EXE.
-If EXE is already running just jump to his window if `helm-raise-command'
-is non--nil.
-When FILE argument is provided run EXE with FILE.
-In this case EXE must be provided as \"EXE %s\"."
- (let* ((real-com (car (split-string (replace-regexp-in-string
- "%s" "" exe))))
- (proc (if file (concat real-com " " file) real-com))
- process-connection-type)
- (if (get-process proc)
- (if helm-raise-command
- (shell-command (format helm-raise-command real-com))
- (error "Error: %s is already running" real-com))
- (when (cl-loop for i in helm-external-commands-list thereis (string= real-com i))
- (message "Starting %s..." real-com)
- (if file
- (start-process-shell-command
- proc nil (format exe (shell-quote-argument
- (if (eq system-type 'windows-nt)
- (helm-w32-prepare-filename file)
- file))))
- (start-process-shell-command proc nil real-com))
- (set-process-sentinel
- (get-process proc)
- (lambda (process event)
- (when (and (string= event "finished\n")
- helm-raise-command
- (not (helm-get-pid-from-process-name real-com)))
- (shell-command (format helm-raise-command "emacs")))
- (message "%s process...Finished." process))))
- (setq helm-external-commands-list
- (cons real-com
- (delete real-com helm-external-commands-list))))))
-
-(defun helm-get-mailcap-for-file (filename)
- "Get the command to use for FILENAME from mailcap files.
-The command is like <command %s> and is meant to use with `format'."
- (mailcap-parse-mailcaps)
- (let* ((ext (file-name-extension filename))
- (mime (when ext (mailcap-extension-to-mime ext)))
- (result (when mime (mailcap-mime-info mime))))
- ;; If elisp file have no associations in .mailcap
- ;; `mailcap-maybe-eval' is returned, in this case just return nil.
- (when (stringp result) result)))
-
-(defun helm-get-default-program-for-file (filename)
- "Try to find a default program to open FILENAME.
-Try first in `helm-external-programs-associations' and then in mailcap file
-if nothing found return nil."
- (let* ((ext (file-name-extension filename))
- (def-prog (assoc-default ext helm-external-programs-associations)))
- (cond ((and def-prog (not (string= def-prog "")))
- (concat def-prog " %s"))
- ((and helm-default-external-file-browser
- (file-directory-p filename))
- (concat helm-default-external-file-browser " %s"))
- (t (helm-get-mailcap-for-file filename)))))
-
-(defun helm-open-file-externally (file)
- "Open FILE with an external program.
-Try to guess which program to use with `helm-get-default-program-for-file'.
-If not found or a prefix arg is given query the user which tool to use."
- (let* ((fname (expand-file-name file))
- (collection (helm-external-commands-list-1 'sort))
- (def-prog (helm-get-default-program-for-file fname))
- (real-prog-name (if (or helm-current-prefix-arg (not def-prog))
- ;; Prefix arg or no default program.
- (prog1
- (helm-comp-read
- "Program: " collection
- :must-match t
- :name "Open file Externally"
- :del-input nil
- :history helm-external-command-history)
- ;; Always prompt to set this program as default.
- (setq def-prog nil))
- ;; No prefix arg or default program exists.
- (replace-regexp-in-string " %s\\| '%s'" "" def-prog)))
- (program (concat real-prog-name " %s")))
- (unless (or def-prog ; Association exists, no need to record it.
- ;; Don't try to record non--filenames associations (e.g urls).
- (not (file-exists-p fname)))
- (when
- (y-or-n-p
- (format
- "Do you want to make `%s' the default program for this kind of files? "
- real-prog-name))
- (helm-aif (assoc (file-name-extension fname)
- helm-external-programs-associations)
- (setq helm-external-programs-associations
- (delete it helm-external-programs-associations)))
- (push (cons (file-name-extension fname)
- (helm-read-string
- "Program (Add args maybe and confirm): " real-prog-name))
- helm-external-programs-associations)
- (customize-save-variable 'helm-external-programs-associations
- helm-external-programs-associations)))
- (helm-run-or-raise program file)
- (setq helm-external-command-history
- (cons real-prog-name
- (delete real-prog-name
- (cl-loop for i in helm-external-command-history
- when (executable-find i) collect i))))))
-
-;;;###autoload
-(defun 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'."
- (interactive (list
- (helm-comp-read
- "RunProgram: "
- (helm-external-commands-list-1 'sort)
- :must-match t
- :del-input nil
- :name "External Commands"
- :history helm-external-command-history)))
- (helm-run-or-raise program)
- (setq helm-external-command-history
- (cons program (delete program
- (cl-loop for i in helm-external-command-history
- when (executable-find i) collect i)))))
-
-
-(provide 'helm-external)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-external ends here
+++ /dev/null
-;;; helm-files.el --- helm file browser and related. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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:
-\f
-(require 'cl-lib)
-(require 'helm)
-(require 'helm-types)
-(require 'helm-utils)
-(require 'helm-external)
-(require 'helm-grep)
-(require 'helm-help)
-(require 'helm-locate)
-(require 'helm-bookmark)
-(require 'helm-tags)
-(require 'helm-buffers)
-(require 'thingatpt)
-(require 'ffap)
-(require 'dired-aux)
-(require 'dired-x)
-(require 'tramp)
-(require 'image-dired)
-
-(declare-function find-library-name "find-func.el" (library))
-(declare-function w32-shell-execute "ext:w32fns.c" (operation document &optional parameters show-flag))
-(declare-function gnus-dired-attach "ext:gnus-dired.el" (files-to-attach))
-(declare-function image-dired-display-image "image-dired.el" (file &optional original-size))
-(declare-function image-dired-update-property "image-dired.el" (prop value))
-(declare-function eshell-read-aliases-list "em-alias")
-(declare-function eshell-send-input "esh-mode" (&optional use-region queue-p no-newline))
-(declare-function eshell-kill-input "esh-mode")
-(declare-function eshell-bol "esh-mode")
-(declare-function eshell-quote-argument "esh-arg.el")
-(declare-function helm-ls-git-ls "ext:helm-ls-git")
-(declare-function helm-hg-find-files-in-project "ext:helm-ls-hg")
-(declare-function helm-gid "helm-id-utils.el")
-(declare-function helm-ls-svn-ls "ext:helm-ls-svn")
-
-(defvar recentf-list)
-(defvar helm-mm-matching-method)
-
-\f
-(defgroup helm-files nil
- "Files applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-boring-file-regexp-list
- (mapcar (lambda (f)
- (concat
- (rx-to-string
- (replace-regexp-in-string
- "/$" "" f) t) "$"))
- completion-ignored-extensions)
- "The regexp list matching boring files."
- :group 'helm-files
- :type '(repeat (choice regexp)))
-
-(defcustom helm-for-files-preferred-list
- '(helm-source-buffers-list
- helm-source-recentf
- helm-source-bookmarks
- helm-source-file-cache
- helm-source-files-in-current-dir
- helm-source-locate)
- "Your preferred sources to find files."
- :type '(repeat (choice symbol))
- :group 'helm-files)
-
-(defcustom helm-tramp-verbose 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."
- :type 'integer
- :group 'helm-files)
-
-(defcustom helm-ff-auto-update-initial-value nil
- "Auto update when only one candidate directory is matched.
-Default value when starting `helm-find-files' is nil because
-it prevent using <backspace> to delete char backward and by the way
-confuse beginners.
-For a better experience with `helm-find-files' set this to non--nil
-and use C-<backspace> to toggle it."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-lynx-style-map t
- "Use arrow keys to navigate with `helm-find-files'.
-You will have to restart Emacs or reeval `helm-find-files-map'
-and `helm-read-file-map' for this take effect."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-history-max-length 100
- "Number of elements shown in `helm-find-files' history."
- :group 'helm-files
- :type 'integer)
-
-(defcustom helm-ff-fuzzy-matching t
- "Enable fuzzy matching for `helm-find-files' when non--nil.
-See `helm-ff--transform-pattern-for-completion' for more info."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-tramp-not-fancy t
- "No colors when listing remote files when set to non--nil.
-This make listing much faster, specially on slow machines."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-exif-data-program "exiftran"
- "Program used to extract exif data of an image file."
- :group 'helm-files
- :type 'string)
-
-(defcustom helm-ff-exif-data-program-args "-d"
- "Arguments used for `helm-ff-exif-data-program'."
- :group 'helm-files
- :type 'string)
-
-(defcustom helm-ff-newfile-prompt-p t
- "Whether Prompt or not when creating new file.
-This set `ffap-newfile-prompt'."
- :type 'boolean
- :group 'helm-files)
-
-(defcustom helm-ff-avfs-directory "~/.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/>."
- :type 'string
- :group 'helm-files)
-
-(defcustom helm-ff-file-compressed-list '("gz" "bz2" "zip" "7z")
- "Minimal list of compressed files extension."
- :type '(repeat (choice string))
- :group 'helm-files)
-
-(defcustom helm-ff-printer-list 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."
- :type '(repeat (choice string))
- :group 'helm-files)
-
-(defcustom helm-ff-transformer-show-only-basename t
- "Show only basename of candidates in `helm-find-files'.
-This can be toggled at anytime from `helm-find-files' with \
-\\<helm-find-files-map>\\[helm-ff-run-toggle-basename]."
- :type 'boolean
- :group 'helm-files)
-
-(defcustom helm-ff-signal-error-on-dot-files 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."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-search-library-in-sexp nil
- "Search for library in `require' and `declare-function' sexp."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-tooltip-hide-delay 25
- "Hide tooltips automatically after this many seconds."
- :group 'helm-files
- :type 'integer)
-
-(defcustom helm-ff-file-name-history-use-recentf nil
- "Use `recentf-list' instead of `file-name-history' in `helm-find-files'."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-skip-boring-files nil
- "Non--nil to skip files matching regexps in `helm-boring-file-regexp-list'.
-This take effect in `helm-find-files' and file completion used by `helm-mode'
-i.e `helm-read-file-name'."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-candidate-number-limit 5000
- "The `helm-candidate-number-limit' for `helm-find-files', `read-file-name' and friends."
- :group 'helm-files
- :type 'integer)
-
-(defcustom helm-findutils-skip-boring-files t
- "Ignore files matching regexps in `completion-ignored-extensions'."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-findutils-search-full-path 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."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-files-save-history-extra-sources
- '("Find" "Locate" "Recentf"
- "Files from Current Directory" "File Cache")
- "Extras source that save candidate to `file-name-history'."
- :group 'helm-files
- :type '(repeat (choice string)))
-
-(defcustom helm-find-files-before-init-hook nil
- "Hook that run before initialization of `helm-find-files'."
- :group 'helm-files
- :type 'hook)
-
-(defcustom helm-find-files-after-init-hook nil
- "Hook that run after initialization of `helm-find-files'."
- :group 'helm-files
- :type 'hook)
-
-(defcustom helm-multi-files-toggle-locate-binding "C-c p"
- "Default binding to switch back and forth locate in `helm-multi-files'."
- :group 'helm-files
- :type 'string)
-
-(defcustom helm-find-files-bookmark-prefix "Helm-find-files: "
- "bookmark name prefix of `helm-find-files' sessions."
- :group 'helm-files
- :type 'string)
-
-(defcustom helm-ff-guess-ffap-filenames 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."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-guess-ffap-urls 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."
- :group 'helm-files
- :type 'boolean)
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-files-faces nil
- "Customize the appearance of helm-files."
- :prefix "helm-"
- :group 'helm-files
- :group 'helm-faces)
-
-(defface helm-ff-prefix
- '((t (:background "yellow" :foreground "black")))
- "Face used to prefix new file or url paths in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-executable
- '((t (:foreground "green")))
- "Face used for executable files in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-directory
- '((t (:foreground "DarkRed" :background "LightGray")))
- "Face used for directories in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-dotted-directory
- '((t (:foreground "black" :background "DimGray")))
- "Face used for dotted directories in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-dotted-symlink-directory
- '((t (:foreground "DarkOrange" :background "DimGray")))
- "Face used for dotted symlinked directories in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-symlink
- '((t (:foreground "DarkOrange")))
- "Face used for symlinks in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-invalid-symlink
- '((t (:foreground "black" :background "red")))
- "Face used for invalid symlinks in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-file
- '((t (:inherit font-lock-builtin-face)))
- "Face used for file names in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-history-deleted
- '((t (:inherit helm-ff-invalid-symlink)))
- "Face used for deleted files in `file-name-history'."
- :group 'helm-files-faces)
-
-(defface helm-history-remote
- '((t (:foreground "Indianred1")))
- "Face used for remote files in `file-name-history'."
- :group 'helm-files-faces)
-
-\f
-;;; Helm-find-files - The helm file browser.
-;;
-;; Keymaps
-(defvar helm-find-files-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-]") 'helm-ff-run-toggle-basename)
- (define-key map (kbd "C-x C-f") 'helm-ff-run-locate)
- (define-key map (kbd "C-x C-d") 'helm-ff-run-browse-project)
- (define-key map (kbd "C-x r m") 'helm-ff-bookmark-set)
- (define-key map (kbd "C-x r b") 'helm-find-files-toggle-to-bookmark)
- (define-key map (kbd "C-s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g p") 'helm-ff-run-pdfgrep)
- (define-key map (kbd "M-g z") 'helm-ff-run-zgrep)
- (define-key map (kbd "M-g a") 'helm-ff-run-grep-ag)
- (define-key map (kbd "M-g g") 'helm-ff-run-git-grep)
- (define-key map (kbd "C-c g") 'helm-ff-run-gid)
- (define-key map (kbd "M-.") 'helm-ff-run-etags)
- (define-key map (kbd "M-R") 'helm-ff-run-rename-file)
- (define-key map (kbd "M-C") 'helm-ff-run-copy-file)
- (define-key map (kbd "M-B") 'helm-ff-run-byte-compile-file)
- (define-key map (kbd "M-L") 'helm-ff-run-load-file)
- (define-key map (kbd "M-S") 'helm-ff-run-symlink-file)
- (define-key map (kbd "M-H") 'helm-ff-run-hardlink-file)
- (define-key map (kbd "M-D") 'helm-ff-run-delete-file)
- (define-key map (kbd "M-K") 'helm-ff-run-kill-buffer-persistent)
- (define-key map (kbd "C-c d") 'helm-ff-persistent-delete)
- (define-key map (kbd "M-e") 'helm-ff-run-switch-to-eshell)
- (define-key map (kbd "C-c i") 'helm-ff-run-complete-fn-at-point)
- (define-key map (kbd "C-c o") 'helm-ff-run-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-ff-run-switch-other-frame)
- (define-key map (kbd "C-c C-x") 'helm-ff-run-open-file-externally)
- (define-key map (kbd "C-c X") 'helm-ff-run-open-file-with-default-tool)
- (define-key map (kbd "M-!") 'helm-ff-run-eshell-command-on-file)
- (define-key map (kbd "M-%") 'helm-ff-run-query-replace-on-marked)
- (define-key map (kbd "C-c =") 'helm-ff-run-ediff-file)
- (define-key map (kbd "M-=") 'helm-ff-run-ediff-merge-file)
- (define-key map (kbd "M-p") 'helm-ff-run-switch-to-history)
- (define-key map (kbd "C-c h") 'helm-ff-file-name-history)
- (define-key map (kbd "M-i") 'helm-ff-properties-persistent)
- (define-key map (kbd "C-}") 'helm-narrow-window)
- (define-key map (kbd "C-{") 'helm-enlarge-window)
- (define-key map (kbd "C-<backspace>") 'helm-ff-run-toggle-auto-update)
- (define-key map (kbd "C-c <DEL>") 'helm-ff-run-toggle-auto-update)
- (define-key map (kbd "C-c C-a") 'helm-ff-run-gnus-attach-files)
- (define-key map (kbd "C-c p") 'helm-ff-run-print-file)
- (define-key map (kbd "C-c /") 'helm-ff-run-find-sh-command)
- ;; 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 "C-l") 'helm-find-files-up-one-level)
- (define-key map (kbd "C-r") 'helm-find-files-down-last-level)
- (define-key map (kbd "C-c r") 'helm-ff-run-find-file-as-root)
- (define-key map (kbd "C-x C-v") 'helm-ff-run-find-alternate-file)
- (define-key map (kbd "C-c @") 'helm-ff-run-insert-org-link)
- (helm-define-key-with-subkeys map (kbd "DEL") ?\d 'helm-ff-delete-char-backward
- nil nil 'helm-ff-delete-char-backward--exit-fn)
- (when helm-ff-lynx-style-map
- (define-key map (kbd "<left>") 'helm-find-files-up-one-level)
- (define-key map (kbd "<right>") 'helm-execute-persistent-action))
- (delq nil map))
- "Keymap for `helm-find-files'.")
-
-(defvar helm-read-file-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "<C-return>") 'helm-cr-empty-string)
- (define-key map (kbd "<M-RET>") 'helm-cr-empty-string)
- (define-key map (kbd "C-]") 'helm-ff-run-toggle-basename)
- (define-key map (kbd "C-.") 'helm-find-files-up-one-level)
- (define-key map (kbd "C-l") 'helm-find-files-up-one-level)
- (define-key map (kbd "C-r") 'helm-find-files-down-last-level)
- (define-key map (kbd "C-c h") 'helm-ff-file-name-history)
- (define-key map (kbd "C-<backspace>") 'helm-ff-run-toggle-auto-update)
- (define-key map (kbd "C-c <DEL>") 'helm-ff-run-toggle-auto-update)
- (helm-define-key-with-subkeys map (kbd "DEL") ?\d 'helm-ff-delete-char-backward
- nil nil 'helm-ff-delete-char-backward--exit-fn)
- (when helm-ff-lynx-style-map
- (define-key map (kbd "<left>") 'helm-find-files-up-one-level)
- (define-key map (kbd "<right>") 'helm-execute-persistent-action)
- (define-key map (kbd "<M-left>") 'helm-previous-source)
- (define-key map (kbd "<M-right>") 'helm-next-source))
- (delq nil map))
- "Keymap for `helm-read-file-name'.")
-
-\f
-;; Internal.
-(defvar helm-find-files-doc-header " (\\<helm-find-files-map>\\[helm-find-files-up-one-level]: Go up one level)"
- "*The doc that is inserted in the Name header of a find-files or dired source.")
-(defvar helm-ff-auto-update-flag nil
- "Internal, flag to turn on/off auto-update in `helm-find-files'.
-Don't set it directly, use instead `helm-ff-auto-update-initial-value'.")
-(defvar helm-ff-last-expanded nil
- "Store last expanded directory or file.")
-(defvar helm-ff-default-directory nil)
-(defvar helm-ff-history nil)
-(defvar helm-ff-cand-to-mark nil)
-(defvar helm-ff-url-regexp
- "\\`\\(news\\(post\\)?:\\|nntp:\\|mailto:\\|file:\\|\\(ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\):/?/?\\).*"
- "Same as `ffap-url-regexp' but match earlier possible url.")
-(defvar helm-tramp-file-name-regexp "\\`/\\([^[/:]+\\|[^/]+]\\):")
-(defvar helm-marked-buffer-name "*helm marked*")
-(defvar helm-ff--auto-update-state nil)
-(defvar helm-ff--deleting-char-backward nil)
-(defvar helm-multi-files--toggle-locate nil)
-(defvar helm-ff--move-to-first-real-candidate t)
-(defvar helm-find-files--toggle-bookmark nil)
-
-\f
-;;; Helm-find-files
-;;
-;;
-(defcustom helm-find-files-actions
- (helm-make-actions
- "Find File" 'helm-find-file-or-marked
- "Find file in Dired" 'helm-point-file-in-dired
- (lambda () (and (locate-library "elscreen") "Find file in Elscreen"))
- 'helm-elscreen-find-file
- "View file" 'view-file
- "Checksum File" 'helm-ff-checksum
- "Query replace fnames on marked" 'helm-ff-query-replace-on-marked
- "Query replace contents on marked" 'helm-ff-query-replace
- "Query replace regexp contents on marked" 'helm-ff-query-replace-regexp
- "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" '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
- "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" 'helm-find-files-ag
- "Git grep" 'helm-ff-git-grep
- "Zgrep File(s) `M-g z, C-u Recurse'" 'helm-ff-zgrep
- "Gid" 'helm-ff-gid
- "Switch to Eshell `M-e'" 'helm-ff-switch-to-eshell
- "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" 'find-alternate-file
- "Ediff File `C-='" 'helm-find-files-ediff-files
- "Ediff Merge File `C-c ='" 'helm-find-files-ediff-merge-files
- "Delete File(s) `M-D'" 'helm-delete-marked-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
- "Find file other window `C-c o'" 'helm-find-files-other-window
- "Switch to history `M-p'" 'helm-find-files-switch-to-hist
- "Find file other frame `C-c C-o'" 'find-file-other-frame
- "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)
- "Actions for `helm-find-files'."
- :group 'helm-files
- :type '(alist :key-type string :value-type function))
-
-(defvar helm-source-find-files nil
- "The main source to browse files.
-Should not be used among other sources.")
-
-(defclass helm-source-ffiles (helm-source-sync)
- ((header-name
- :initform (lambda (name)
- (concat name (substitute-command-keys
- helm-find-files-doc-header))))
- (init
- :initform (lambda ()
- (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)))
- (candidates :initform 'helm-find-files-get-candidates)
- (filtered-candidate-transformer :initform 'helm-ff-sort-candidates)
- (filter-one-by-one :initform 'helm-ff-filter-candidate-one-by-one)
- (persistent-action :initform 'helm-find-files-persistent-action)
- (persistent-help :initform "Hit1 Expand Candidate, Hit2 or (C-u) Find file")
- (help-message :initform 'helm-ff-help-message)
- (volatile :initform t)
- (migemo :initform t)
- (nohighlight :initform t)
- (keymap :initform helm-find-files-map)
- (candidate-number-limit :initform 'helm-ff-candidate-number-limit)
- (action-transformer
- :initform 'helm-find-files-action-transformer)
- (action :initform 'helm-find-files-actions)
- (before-init-hook :initform 'helm-find-files-before-init-hook)
- (after-init-hook :initform 'helm-find-files-after-init-hook)))
-
-;; Bookmark handlers.
-;;
-(defun helm-ff-make-bookmark-record ()
- "The `bookmark-make-record-function' for `helm-find-files'."
- (with-helm-buffer
- `((filename . ,helm-ff-default-directory)
- (presel . ,(helm-get-selection))
- (handler . helm-ff-bookmark-jump))))
-
-(defun helm-ff-bookmark-jump (bookmark)
- "bookmark handler for `helm-find-files'."
- (let ((fname (bookmark-prop-get bookmark 'filename))
- (presel (bookmark-prop-get bookmark 'presel)))
- (helm-find-files-1 fname (if helm-ff-transformer-show-only-basename
- (helm-basename presel)
- presel))))
-
-(defun helm-ff-bookmark-set ()
- "Record `helm-find-files' session in bookmarks."
- (interactive)
- (with-helm-buffer
- (bookmark-set
- (concat helm-find-files-bookmark-prefix
- (abbreviate-file-name helm-ff-default-directory))))
- (message "Helm find files session bookmarked! "))
-
-(defun helm-dwim-target-directory ()
- "Return value of `default-directory' of buffer in other window.
-If there is only one window return the value ot `default-directory'
-for current buffer."
- (with-helm-current-buffer
- (let ((num-windows (length (remove (get-buffer-window helm-marked-buffer-name)
- (window-list)))))
- (expand-file-name
- (if (> num-windows 1)
- (save-selected-window
- (other-window 1)
- default-directory)
- ;; Using the car of *ff-history allow
- ;; allow staying in the directory visited instead of current.
- (or (car-safe helm-ff-history) default-directory))))))
-
-(defun helm-find-files-do-action (action)
- "Generic function for creating actions from `helm-source-find-files'.
-ACTION must be an action supported by `helm-dired-action'."
- (let* ((ifiles (mapcar 'expand-file-name ; Allow modify '/foo/.' -> '/foo'
- (helm-marked-candidates :with-wildcard t)))
- (cand (helm-get-selection)) ; Target
- (prompt (format "%s %s file(s) to: "
- (capitalize (symbol-name action))
- (length ifiles)))
- helm-ff--move-to-first-real-candidate
- (helm-always-two-windows t)
- (helm-reuse-last-window-split-state t)
- (helm-split-window-default-side
- (eq helm-split-window-default-side 'same))
- helm-split-window-in-side-p
- (parg helm-current-prefix-arg)
- helm-display-source-at-screen-top ; prevent setting window-start.
- helm-ff-auto-update-initial-value
- (dest (with-helm-display-marked-candidates
- helm-marked-buffer-name
- (mapcar (lambda (f)
- (if (file-directory-p f)
- (concat (helm-basename f) "/")
- (helm-basename f)))
- ifiles)
- (with-helm-current-buffer
- (helm-read-file-name
- prompt
- :preselect (unless (cdr ifiles)
- (if helm-ff-transformer-show-only-basename
- (helm-basename cand) cand))
- :initial-input (helm-dwim-target-directory)
- :history (helm-find-files-history :comp-read nil))))))
- (helm-dired-action
- dest :files ifiles :action action :follow parg)))
-
-(defun helm-find-files-copy (_candidate)
- "Copy files from `helm-find-files'."
- (helm-find-files-do-action 'copy))
-
-(defun helm-find-files-rename (_candidate)
- "Rename files from `helm-find-files'."
- (helm-find-files-do-action 'rename))
-
-(defun helm-find-files-symlink (_candidate)
- "Symlink files from `helm-find-files'."
- (helm-find-files-do-action 'symlink))
-
-(defun helm-find-files-relsymlink (_candidate)
- "Relsymlink files from `helm-find-files'."
- (helm-find-files-do-action 'relsymlink))
-
-(defun helm-find-files-hardlink (_candidate)
- "Hardlink files from `helm-find-files'."
- (helm-find-files-do-action 'hardlink))
-
-(defun helm-find-files-other-window (_candidate)
- "Keep current-buffer and open files in separate windows."
- (let* ((files (helm-marked-candidates))
- (buffers (mapcar 'find-file-noselect files)))
- (switch-to-buffer-other-window (car buffers))
- (helm-aif (cdr buffers)
- (save-selected-window
- (cl-loop for buffer in it
- do (progn
- (select-window (split-window))
- (switch-to-buffer buffer)))))))
-
-(defun helm-find-files-byte-compile (_candidate)
- "Byte compile elisp files from `helm-find-files'."
- (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))))
-
-(defun helm-find-files-load-files (_candidate)
- "Load elisp files from `helm-find-files'."
- (let ((files (helm-marked-candidates :with-wildcard t)))
- (cl-loop for fname in files
- do (load fname))))
-
-(defun helm-find-files-ediff-files-1 (candidate &optional merge)
- "Generic function to ediff/merge files in `helm-find-files'."
- (let* ((bname (helm-basename candidate))
- (marked (helm-marked-candidates :with-wildcard t))
- (prompt (if merge "Ediff Merge `%s' With File: "
- "Ediff `%s' With File: "))
- (fun (if merge 'ediff-merge-files 'ediff-files))
- (input (helm-dwim-target-directory))
- (presel (if helm-ff-transformer-show-only-basename
- (helm-basename candidate)
- (expand-file-name
- (helm-basename candidate)
- input))))
- (if (= (length marked) 2)
- (funcall fun (car marked) (cadr marked))
- (funcall fun candidate (helm-read-file-name
- (format prompt bname)
- :initial-input input
- :preselect presel)))))
-
-(defun helm-find-files-ediff-files (candidate)
- (helm-find-files-ediff-files-1 candidate))
-
-(defun helm-find-files-ediff-merge-files (candidate)
- (helm-find-files-ediff-files-1 candidate 'merge))
-
-(defun helm-find-files-grep (_candidate)
- "Default action to grep files from `helm-find-files'."
- (helm-do-grep-1 (helm-marked-candidates :with-wildcard t)
- helm-current-prefix-arg))
-
-(defun helm-ff-git-grep (_candidate)
- "Default action to git-grep `helm-ff-default-directory'."
- (helm-grep-git-1 helm-ff-default-directory helm-current-prefix-arg))
-
-(defun helm-find-files-ag (_candidate)
- (helm-grep-ag-1 helm-ff-default-directory))
-
-(defun helm-ff-zgrep (_candidate)
- "Default action to zgrep files from `helm-find-files'."
- (helm-ff-zgrep-1 (helm-marked-candidates :with-wildcard t) helm-current-prefix-arg))
-
-(defun helm-ff-pdfgrep (_candidate)
- "Default action to pdfgrep files from `helm-find-files'."
- (let ((cands (cl-loop for file in (helm-marked-candidates :with-wildcard t)
- if (or (string= (file-name-extension file) "pdf")
- (string= (file-name-extension file) "PDF"))
- collect file))
- (helm-pdfgrep-default-function 'helm-pdfgrep-init))
- (when cands
- (helm-do-pdfgrep-1 cands))))
-
-(defun helm-ff-etags-select (candidate)
- "Default action to jump to etags from `helm-find-files'."
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (let* ((source-name (assoc-default 'name (helm-get-current-source)))
- (default-directory (if (string= source-name "Find Files")
- helm-ff-default-directory
- (file-name-directory candidate))))
- (helm-etags-select helm-current-prefix-arg)))
-
-(defun helm-find-files-switch-to-hist (_candidate)
- "Switch to helm-find-files history."
- (helm-find-files t))
-
-(defvar eshell-command-aliases-list nil)
-(defvar helm-eshell-command-on-file-input-history nil)
-(defun helm-find-files-eshell-command-on-file-1 (&optional map)
- "Run `eshell-command' on CANDIDATE or marked candidates.
-This is done possibly with an eshell alias, if no alias found, you can type in
-an eshell command.
-
-Basename of CANDIDATE can be a wild-card.
-e.g you can do \"eshell-command command *.el\"
-Where \"*.el\" is the CANDIDATE.
-
-It is possible to do eshell-command command <CANDIDATE> <some more args>
-like this: \"command %s some more args\".
-
-If MAP is given run `eshell-command' on all marked files at once,
-Otherwise, run `eshell-command' on each marked files.
-In other terms, with a prefix arg do on the three marked files
-\"foo\" \"bar\" \"baz\":
-
-\"eshell-command command foo bar baz\"
-
-otherwise do
-
-\"eshell-command command foo\"
-\"eshell-command command bar\"
-\"eshell-command command baz\"
-
-Note:
-If `eshell' or `eshell-command' have not been run once,
-or if you have no eshell aliases `eshell-command-aliases-list'
-will not be loaded first time you use this."
- (when (or eshell-command-aliases-list
- (y-or-n-p "Eshell is not loaded, run eshell-command without alias anyway? "))
- (and eshell-command-aliases-list (eshell-read-aliases-list))
- (let* ((cand-list (helm-marked-candidates))
- (default-directory (or helm-ff-default-directory
- ;; If candidate is an url *-ff-default-directory is nil
- ;; so keep value of default-directory.
- default-directory))
- (command (helm-comp-read
- "Command: "
- (cl-loop for (a . c) in eshell-command-aliases-list
- when (string-match "\\(\\$1\\|\\$\\*\\)$" (car c))
- collect (propertize a 'help-echo (car c)) into ls
- finally return (sort ls 'string<))
- :buffer "*helm eshell on file*"
- :name "Eshell command"
- :mode-line
- '("Eshell alias"
- "C-h m: Help, \\[universal-argument]: Insert output at point")
- :help-message 'helm-esh-help-message
- :input-history
- 'helm-eshell-command-on-file-input-history))
- (alias-value (car (assoc-default command eshell-command-aliases-list)))
- cmd-line)
- (if (or (equal helm-current-prefix-arg '(16))
- (equal map '(16)))
- ;; Two time C-u from `helm-comp-read' mean print to current-buffer.
- ;; i.e `eshell-command' will use this value.
- (setq current-prefix-arg '(16))
- ;; Else reset the value of `current-prefix-arg'
- ;; to avoid printing in current-buffer.
- (setq current-prefix-arg nil))
- (if (and (or
- ;; One prefix-arg have been passed before `helm-comp-read'.
- ;; If map have been set with C-u C-u (value == '(16))
- ;; ignore it.
- (and map (equal map '(4)))
- ;; One C-u from `helm-comp-read'.
- (equal helm-current-prefix-arg '(4))
- ;; An alias that finish with $*
- (and alias-value
- ;; If command is an alias be sure it accept
- ;; more than one arg i.e $*.
- (string-match "\\$\\*$" alias-value)))
- (cdr cand-list))
-
- ;; Run eshell-command with ALL marked files as arguments.
- ;; This wont work on remote files, because tramp handlers depends
- ;; on `default-directory' (limitation).
- (let ((mapfiles (mapconcat 'eshell-quote-argument cand-list " ")))
- (if (string-match "'%s'\\|\"%s\"\\|%s" command)
- (setq cmd-line (format command mapfiles)) ; See [1]
- (setq cmd-line (format "%s %s" command mapfiles)))
- (helm-log "%S" cmd-line)
- (eshell-command cmd-line))
-
- ;; Run eshell-command on EACH marked files.
- ;; To work with tramp handler we have to call
- ;; COMMAND on basename of each file, using
- ;; its basedir as `default-directory'.
- (cl-loop for f in cand-list
- for dir = (and (not (string-match ffap-url-regexp f))
- (helm-basedir f))
- for file = (eshell-quote-argument
- (format "%s" (if (and dir (file-remote-p dir))
- (helm-basename f) f)))
- for com = (if (string-match "'%s'\\|\"%s\"\\|%s" command)
- ;; [1] This allow to enter other args AFTER filename
- ;; i.e <command %s some_more_args>
- (format command file)
- (format "%s %s" command file))
- do (let ((default-directory (or dir default-directory)))
- (eshell-command com)))))))
-
-(defun helm-find-files-eshell-command-on-file (_candidate)
- "Run `eshell-command' on CANDIDATE or marked candidates.
-See `helm-find-files-eshell-command-on-file-1' for more info."
- (helm-find-files-eshell-command-on-file-1 helm-current-prefix-arg))
-
-(defun helm-ff-switch-to-eshell (_candidate)
- "Switch to eshell and cd to `helm-ff-default-directory'."
- (let ((cd-eshell (lambda ()
- (eshell-kill-input)
- (goto-char (point-max))
- (insert
- (format "cd '%s'" helm-ff-default-directory))
- (eshell-send-input))))
- (if (get-buffer "*eshell*")
- (switch-to-buffer "*eshell*")
- (call-interactively 'eshell))
- (unless (get-buffer-process (current-buffer))
- (funcall cd-eshell))))
-
-(defun helm-ff-serial-rename-action (method)
- "Rename all marked files in `helm-ff-default-directory' with METHOD.
-See `helm-ff-serial-rename-1'."
- (let* ((helm--reading-passwd-or-string t)
- (cands (helm-marked-candidates :with-wildcard t))
- (def-name (car cands))
- (name (helm-read-string "NewName: "
- (replace-regexp-in-string
- "[0-9]+$" ""
- (helm-basename
- def-name
- (file-name-extension def-name)))))
- (start (read-number "StartAtNumber: "))
- (extension (helm-read-string "Extension: "
- (file-name-extension (car cands))))
- (dir (expand-file-name
- (helm-read-file-name
- "Serial Rename to directory: "
- :initial-input
- (expand-file-name helm-ff-default-directory)
- :test 'file-directory-p
- :must-match t)))
- done)
- (with-helm-display-marked-candidates
- helm-marked-buffer-name (mapcar 'helm-basename cands)
- (if (y-or-n-p
- (format "Rename %s file(s) to <%s> like this ?\n%s "
- (length cands) dir (format "%s <-> %s%s.%s"
- (helm-basename (car cands))
- name start extension)))
- (progn
- (helm-ff-serial-rename-1
- dir cands name start extension :method method)
- (setq done t)
- (message nil))))
- (if done
- (with-helm-current-buffer (helm-find-files-1 dir))
- (message "Operation aborted"))))
-
-(defun helm-ff-member-directory-p (file directory)
- (let ((dir-file (expand-file-name
- (file-name-as-directory (file-name-directory file))))
- (cur-dir (expand-file-name (file-name-as-directory directory))))
- (string= dir-file cur-dir)))
-
-(cl-defun helm-ff-serial-rename-1
- (directory collection new-name start-at-num extension &key (method 'rename))
- "rename files in COLLECTION to DIRECTORY with the prefix name NEW-NAME.
-Rename start at number START-AT-NUM - ex: prefixname-01.jpg.
-EXTENSION is the file extension to use, in empty prompt,
-reuse the original extension of file.
-METHOD can be one of rename, copy or symlink.
-Files will be renamed if they are files of current directory, otherwise they
-will be treated with METHOD.
-Default METHOD is rename."
- ;; Maybe remove directories selected by error in collection.
- (setq collection (cl-remove-if 'file-directory-p collection))
- (let* ((tmp-dir (file-name-as-directory
- (concat (file-name-as-directory directory)
- (symbol-name (cl-gensym "tmp")))))
- (fn (cl-case method
- (copy 'copy-file)
- (symlink 'make-symbolic-link)
- (rename 'rename-file)
- (t (error "Error: Unknown method %s" method)))))
- (make-directory tmp-dir)
- (unwind-protect
- (progn
- ;; Rename all files to tmp-dir with new-name.
- ;; If files are not from start directory, use method
- ;; to move files to tmp-dir.
- (cl-loop for i in collection
- for count from start-at-num
- for fnum = (if (< count 10) "0%s" "%s")
- for nname = (concat tmp-dir new-name (format fnum count)
- (if (not (string= extension ""))
- (format ".%s" (replace-regexp-in-string
- "[.]" "" extension))
- (file-name-extension i 'dot)))
- do (if (helm-ff-member-directory-p i directory)
- (rename-file i nname)
- (funcall fn i nname)))
- ;; Now move all from tmp-dir to destination.
- (cl-loop with dirlist = (directory-files
- tmp-dir t directory-files-no-dot-files-regexp)
- for f in dirlist do
- (if (file-symlink-p f)
- (make-symbolic-link (file-truename f)
- (concat (file-name-as-directory directory)
- (helm-basename f)))
- (rename-file f directory))))
- (delete-directory tmp-dir t))))
-
-(defun helm-ff-serial-rename (_candidate)
- "Serial rename all marked files to `helm-ff-default-directory'.
-Rename only file of current directory, and symlink files coming from
-other directories.
-See `helm-ff-serial-rename-1'."
- (helm-ff-serial-rename-action 'rename))
-
-(defun helm-ff-serial-rename-by-symlink (_candidate)
- "Serial rename all marked files to `helm-ff-default-directory'.
-Rename only file of current directory, and symlink files coming from
-other directories.
-See `helm-ff-serial-rename-1'."
- (helm-ff-serial-rename-action 'symlink))
-
-(defun helm-ff-serial-rename-by-copying (_candidate)
- "Serial rename all marked files to `helm-ff-default-directory'.
-Rename only file of current directory, and copy files coming from
-other directories.
-See `helm-ff-serial-rename-1'."
- (helm-ff-serial-rename-action 'copy))
-
-(defun helm-ff-query-replace-on-marked-1 (candidates)
- "Query replace on filenames of CANDIDATES.
-This doesn't replace inside the files, only modify filenames."
- (with-helm-display-marked-candidates
- helm-marked-buffer-name
- (mapcar 'helm-basename candidates)
- (let* ((regexp (read-string "Replace regexp on filename(s): "))
- (str (read-string (format "Replace regexp `%s' with: " regexp))))
- (cl-loop with query = "y"
- with count = 0
- for old in candidates
- for new = (concat (helm-basedir old)
- (replace-regexp-in-string
- regexp str
- (helm-basename old)))
- ;; If `regexp' is not matched in `old'
- ;; `replace-regexp-in-string' will
- ;; return `old' unmodified.
- unless (string= old new)
- do (progn
- (unless (string= query "!")
- (while (not (member
- (setq query
- (string
- (read-key
- (propertize
- (format
- "Replace `%s' by `%s' [!,y,n,q]"
- old new)
- 'face 'minibuffer-prompt))))
- '("y" "!" "n" "q")))
- (message "Please answer by y,n,! or q") (sit-for 1)))
- (when (string= query "q")
- (cl-return (message "Operation aborted")))
- (unless (string= query "n")
- (rename-file old new)
- (cl-incf count)))
- finally (message "%d Files renamed" count))))
- ;; This fix the emacs bug where "Emacs-Lisp:" is sent
- ;; in minibuffer (not the echo area).
- (sit-for 0.1)
- (with-current-buffer (window-buffer (minibuffer-window))
- (delete-minibuffer-contents)))
-
-;; The action.
-(defun helm-ff-query-replace-on-marked (_candidate)
- (let ((marked (helm-marked-candidates)))
- (helm-ff-query-replace-on-marked-1 marked)))
-
-;; The command for `helm-find-files-map'.
-(defun helm-ff-run-query-replace-on-marked ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-query-replace-on-marked)))
-
-(defun helm-ff-query-replace (_candidate)
- (let ((bufs (cl-loop for f in (helm-marked-candidates)
- collect (buffer-name (find-file-noselect f)))))
- (helm-buffer-query-replace-1 nil bufs)))
-
-(defun helm-ff-query-replace-regexp (_candidate)
- (let ((bufs (cl-loop for f in (helm-marked-candidates)
- collect (buffer-name (find-file-noselect f)))))
- (helm-buffer-query-replace-1 'regexp bufs)))
-
-(defun helm-ff-run-query-replace ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-query-replace)))
-
-(defun helm-ff-run-query-replace-regexp ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-query-replace-regexp)))
-
-(defun helm-ff-toggle-auto-update (_candidate)
- (setq helm-ff-auto-update-flag (not helm-ff-auto-update-flag))
- (setq helm-ff--auto-update-state helm-ff-auto-update-flag)
- (message "[Auto expansion %s]"
- (if helm-ff-auto-update-flag "enabled" "disabled")))
-
-(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-execute-persistent-action 'toggle-auto-update)))
-
-(defun helm-ff-delete-char-backward ()
- "Disable helm find files auto update and delete char backward."
- (interactive)
- (setq helm-ff-auto-update-flag nil)
- (setq helm-ff--deleting-char-backward t)
- (call-interactively
- (lookup-key (current-global-map)
- (read-kbd-macro "DEL"))))
-
-(defun helm-ff-delete-char-backward--exit-fn ()
- (setq helm-ff-auto-update-flag helm-ff--auto-update-state)
- (setq helm-ff--deleting-char-backward nil))
-
-(defun helm-ff-run-switch-to-history ()
- "Run Switch to history action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (when (helm-file-completion-source-p)
- (helm-exit-and-execute-action 'helm-find-files-switch-to-hist))))
-
-(defun helm-ff-run-grep ()
- "Run Grep action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-grep)))
-
-(defun helm-ff-run-git-grep ()
- "Run git-grep action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-git-grep)))
-
-(defun helm-ff-run-grep-ag ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-ag)))
-
-(defun helm-ff-run-pdfgrep ()
- "Run Pdfgrep action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-pdfgrep)))
-
-(defun helm-ff-run-zgrep ()
- "Run Grep action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-zgrep)))
-
-(defun helm-ff-run-copy-file ()
- "Run Copy file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-copy)))
-
-(defun helm-ff-run-rename-file ()
- "Run Rename file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-rename)))
-
-(defun helm-ff-run-byte-compile-file ()
- "Run Byte compile file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-byte-compile)))
-
-(defun helm-ff-run-load-file ()
- "Run Load file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-load-files)))
-
-(defun helm-ff-run-eshell-command-on-file ()
- "Run eshell command on file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- 'helm-find-files-eshell-command-on-file)))
-
-(defun helm-ff-run-ediff-file ()
- "Run Ediff file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-ediff-files)))
-
-(defun helm-ff-run-ediff-merge-file ()
- "Run Ediff merge file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- 'helm-find-files-ediff-merge-files)))
-
-(defun helm-ff-run-symlink-file ()
- "Run Symlink file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-symlink)))
-
-(defun helm-ff-run-hardlink-file ()
- "Run Hardlink file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-hardlink)))
-
-(defun helm-ff-run-delete-file ()
- "Run Delete file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-delete-marked-files)))
-
-(defun helm-ff-run-complete-fn-at-point ()
- "Run complete file name action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- 'helm-insert-file-name-completion-at-point)))
-
-(defun helm-ff-run-switch-to-eshell ()
- "Run switch to eshell action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-switch-to-eshell)))
-
-(defun helm-ff-run-switch-other-window ()
- "Run switch to other window action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-other-window)))
-
-(defun helm-ff-run-switch-other-frame ()
- "Run switch to other frame action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'find-file-other-frame)))
-
-(defun helm-ff-run-open-file-externally ()
- "Run open file externally command action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-open-file-externally)))
-
-(defun helm-ff-run-open-file-with-default-tool ()
- "Run open file externally command action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-open-file-with-default-tool)))
-
-(defun helm-ff-locate (candidate)
- "Locate action function for `helm-find-files'."
- (helm-locate-set-command)
- (let ((input (concat (helm-basename
- (expand-file-name
- candidate
- helm-ff-default-directory))
- ;; The locate '-b' option doesn't exists
- ;; in everything (es).
- (unless (and (eq system-type 'windows-nt)
- (string-match "^es" helm-locate-command))
- " -b"))))
- (helm-locate-1 helm-current-prefix-arg nil 'from-ff input)))
-
-(defun helm-ff-run-locate ()
- "Run locate action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-locate)))
-
-(defun helm-files-insert-as-org-link (candidate)
- (insert (format "[[%s][]]" candidate))
- (goto-char (- (point) 2)))
-
-(defun helm-ff-run-insert-org-link ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-files-insert-as-org-link)))
-
-(defun helm-ff-run-find-file-as-root ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-file-as-root)))
-
-(defun helm-ff-run-find-alternate-file ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'find-alternate-file)))
-
-(defun helm-ff-run-gnus-attach-files ()
- "Run gnus attach files command action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-gnus-attach-files)))
-
-(defun helm-ff-run-etags ()
- "Run Etags command action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-etags-select)))
-
-(defvar lpr-printer-switch)
-(defun helm-ff-print (_candidate)
- "Print marked files.
-
-You may to set in order
-variables `lpr-command',`lpr-switches' and/or `printer-name',
-but with no settings helm should detect your printer(s) and
-print with the default `lpr' settings.
-
-NOTE: DO NOT set the \"-P\" flag in `lpr-switches', if you really
-have to modify this, do it in `lpr-printer-switch'.
-
-Same as `dired-do-print' but for helm."
- (require 'lpr)
- (when (or helm-current-prefix-arg
- (not helm-ff-printer-list))
- (setq helm-ff-printer-list
- (helm-ff-find-printers)))
- (let* ((file-list (helm-marked-candidates :with-wildcard t))
- (len (length file-list))
- (printer-name (if helm-ff-printer-list
- (helm-comp-read
- "Printer: " helm-ff-printer-list)
- printer-name))
- (lpr-switches
- (if (and (stringp printer-name)
- (string< "" printer-name))
- (cons (concat lpr-printer-switch printer-name)
- lpr-switches)
- lpr-switches))
- (command (helm-read-string
- (format "Print *%s File(s):\n%s with: "
- len
- (mapconcat
- (lambda (f) (format "- %s\n" f))
- file-list ""))
- (when (and lpr-command lpr-switches)
- (mapconcat 'identity
- (cons lpr-command
- (if (stringp lpr-switches)
- (list lpr-switches)
- lpr-switches))
- " "))))
- (file-args (mapconcat (lambda (x)
- (format "'%s'" x))
- file-list " "))
- (cmd-line (concat command " " file-args)))
- (if command
- (start-process-shell-command "helm-print" nil cmd-line)
- (error "Error: Please verify your printer settings in Emacs."))))
-
-(defun helm-ff-run-print-file ()
- "Run Print file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-print)))
-
-(defun helm-ff-checksum (file)
- "Calculate the checksum of FILE.
-The checksum is copied to kill-ring."
- (let ((algo (intern (helm-comp-read
- "Algorithm: "
- '(md5 sha1 sha224 sha256 sha384 sha512)))))
- (kill-new (with-temp-buffer
- (insert-file-contents-literally file)
- (secure-hash algo (current-buffer))))
- (message "Checksum copied to kill-ring.")))
-
-(defun helm-ff-toggle-basename (_candidate)
- (with-helm-buffer
- (setq helm-ff-transformer-show-only-basename
- (not helm-ff-transformer-show-only-basename))
- (let* ((cand (helm-get-selection nil t))
- (target (if helm-ff-transformer-show-only-basename
- (helm-basename cand) cand)))
- (helm-force-update (regexp-quote target)))))
-
-(defun helm-ff-run-toggle-basename ()
- (interactive)
- (with-helm-alive-p
- (unless (helm-empty-source-p)
- (helm-ff-toggle-basename nil))))
-
-(cl-defun helm-reduce-file-name (fname level &key unix-close expand)
- "Reduce FNAME by LEVEL from end or beginning depending LEVEL value.
-If LEVEL is positive reduce from end else from beginning.
-If UNIX-CLOSE is non--nil close filename with /.
-If EXPAND is non--nil expand-file-name."
- (let* ((exp-fname (expand-file-name fname))
- (fname-list (split-string (if (or (string= fname "~/") expand)
- exp-fname fname) "/" t))
- (len (length fname-list))
- (pop-list (if (< level 0)
- (cl-subseq fname-list (* level -1))
- (cl-subseq fname-list 0 (- len level))))
- (result (mapconcat 'identity pop-list "/"))
- (empty (string= result "")))
- (when unix-close (setq result (concat result "/")))
- (if (string-match "^~" result)
- (if (string= result "~/") "~/" result)
- (if (< level 0)
- (if empty "../" (concat "../" result))
- (cond ((eq system-type 'windows-nt)
- (if empty (expand-file-name "/") ; Expand to "/" or "c:/".
- result))
- (empty "/")
- (t
- (concat "/" result)))))))
-
-(defvar helm-find-files--level-tree nil)
-(defvar helm-find-files--level-tree-iterator nil)
-(defun 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."
- (interactive "p")
- (with-helm-alive-p
- (when (and (helm-file-completion-source-p)
- (not (helm-ff-invalid-tramp-name-p)))
- (with-helm-window
- (when helm-follow-mode
- (helm-follow-mode -1) (message nil)))
- ;; When going up one level we want to be at the line
- ;; corresponding to actual directory, so store this info
- ;; in `helm-ff-last-expanded'.
- (let ((cur-cand (helm-get-selection))
- (new-pattern (helm-reduce-file-name
- helm-pattern arg :unix-close t :expand t)))
- (cond ((file-directory-p helm-pattern)
- (setq helm-ff-last-expanded helm-ff-default-directory))
- ((file-exists-p helm-pattern)
- (setq helm-ff-last-expanded helm-pattern))
- ((and cur-cand (file-exists-p cur-cand))
- (setq helm-ff-last-expanded cur-cand)))
- (unless helm-find-files--level-tree
- (setq helm-find-files--level-tree
- (cons helm-ff-default-directory
- helm-find-files--level-tree)))
- (setq helm-find-files--level-tree-iterator nil)
- (push new-pattern helm-find-files--level-tree)
- (helm-set-pattern new-pattern helm-suspend-update-flag)
- (with-helm-after-update-hook (helm-ff-retrieve-last-expanded))))))
-
-(defun helm-find-files-down-last-level ()
- "Retrieve previous paths reached by `C-l' in helm-find-files."
- (interactive)
- (with-helm-alive-p
- (when (and (helm-file-completion-source-p)
- (not (helm-ff-invalid-tramp-name-p)))
- (unless helm-find-files--level-tree-iterator
- (setq helm-find-files--level-tree-iterator
- (helm-iter-list (cdr helm-find-files--level-tree))))
- (setq helm-find-files--level-tree nil)
- (helm-aif (helm-iter-next helm-find-files--level-tree-iterator)
- (helm-set-pattern it)
- (setq helm-find-files--level-tree-iterator nil)))))
-
-(defun helm-find-files--reset-level-tree ()
- (setq helm-find-files--level-tree-iterator nil
- helm-find-files--level-tree nil))
-
-(add-hook 'helm-cleanup-hook 'helm-find-files--reset-level-tree)
-(add-hook 'post-self-insert-hook 'helm-find-files--reset-level-tree)
-(add-hook 'helm-after-persistent-action-hook 'helm-find-files--reset-level-tree)
-
-(defun helm-ff-retrieve-last-expanded ()
- "Move overlay to last visited directory `helm-ff-last-expanded'.
-This happen after using `helm-find-files-up-one-level',
-or hitting C-j on \"..\"."
- (when helm-ff-last-expanded
- (let ((presel (if helm-ff-transformer-show-only-basename
- (helm-basename
- (directory-file-name helm-ff-last-expanded))
- (directory-file-name helm-ff-last-expanded))))
- (with-helm-window
- (when (re-search-forward (concat "^" (regexp-quote presel) "$") nil t)
- (forward-line 0)
- (helm-mark-current-line)))
- (setq helm-ff-last-expanded nil))))
-
-(defun helm-ff-move-to-first-real-candidate ()
- "When candidate is an incomplete file name move to first real candidate."
- (helm-aif (and (helm-file-completion-source-p)
- (not (helm-empty-source-p))
- (not (string-match
- "\\`[Dd]ired-"
- (assoc-default 'name (helm-get-current-source))))
- helm-ff--move-to-first-real-candidate
- (helm-get-selection))
- (unless (or (not (stringp it))
- (and (string-match helm-tramp-file-name-regexp it)
- (not (file-remote-p it nil t)))
- (file-exists-p it))
- (helm-next-line))))
-(add-hook 'helm-after-update-hook 'helm-ff-move-to-first-real-candidate)
-
-;;; Auto-update - helm-find-files auto expansion of directories.
-;;
-;;
-(defun helm-ff-update-when-only-one-matched ()
- "Expand to directory when sole completion.
-When only one candidate is remaining and it is a directory,
-expand to this directory.
-This happen only when `helm-ff-auto-update-flag' is non--nil
-or when `helm-pattern' is equal to \"~/\"."
- (when (and (helm-file-completion-source-p)
- (not (helm-ff-invalid-tramp-name-p)))
- (with-helm-window
- (let* ((history-p (string= (assoc-default
- 'name (helm-get-current-source))
- "Read File Name History"))
- (pat (if (string-match helm-tramp-file-name-regexp
- helm-pattern)
- (helm-create-tramp-name helm-pattern)
- helm-pattern))
- (completed-p (string= (file-name-as-directory
- (expand-file-name
- (substitute-in-file-name pat)))
- helm-ff-default-directory))
- (candnum (helm-get-candidate-number))
- (lt2-p (and (<= candnum 2)
- (>= (string-width (helm-basename helm-pattern)) 2)))
- (cur-cand (prog2
- (unless (or completed-p
- (file-exists-p pat)
- history-p (null lt2-p))
- ;; Only one non--existing candidate
- ;; and one directory candidate, move to it,
- ;; but not when renaming, copying etc...,
- ;; so for this use
- ;; `helm-ff-move-to-first-real-candidate'
- ;; instead of `helm-next-line' (Issue #910).
- (helm-ff-move-to-first-real-candidate))
- (helm-get-selection))))
- (when (and (or (and helm-ff-auto-update-flag
- (null helm-ff--deleting-char-backward)
- (not (get-buffer-window helm-action-buffer 'visible))
- ;; Issue #295
- ;; File predicates are returning t
- ;; with paths like //home/foo.
- ;; So check it is not the case by regexp
- ;; to allow user to do C-a / to start e.g
- ;; entering a tramp method e.g /sudo::.
- (not (string-match "\\`//" helm-pattern))
- (not (eq last-command 'helm-yank-text-at-point)))
- ;; Fix issue #542.
- (string= helm-pattern "~/")
- ;; Only one remaining directory, expand it.
- (and (= candnum 1)
- helm-ff--auto-update-state
- (file-accessible-directory-p pat)
- (null helm-ff--deleting-char-backward)))
- (or
- ;; Only one candidate remaining
- ;; and at least 2 char in basename.
- lt2-p
- ;; Already completed.
- completed-p)
- (not history-p) ; Don't try to auto complete in history.
- (stringp cur-cand)
- (file-accessible-directory-p cur-cand))
- (if (and (not (helm-dir-is-dot cur-cand)) ; [1]
- ;; Maybe we are here because completed-p is true
- ;; but check this again to be sure. (Windows fix)
- (<= candnum 2)) ; [2]
- ;; If after going to next line the candidate
- ;; 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 cur-cand))
- ;; 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
- ;; of name unless helm-pattern ends with "."
- ;; (i.e we are writing something starting with ".")
- (unless (string-match "\\`.*[.]\\{1\\}\\'" helm-pattern)
- (helm-set-pattern
- ;; Need to expand-file-name to avoid e.g /ssh:host:./ in prompt.
- (expand-file-name (file-name-as-directory helm-pattern)))))
- (helm-check-minibuffer-input))))))
-
-(defun helm-ff-auto-expand-to-home-or-root ()
- "Allow expanding to home/user directory or root or text yanked after pattern."
- (when (and (helm-file-completion-source-p)
- (string-match
- "/?\\$.*/\\|/\\./\\|/\\.\\./\\|/~.*/\\|//\\|\\(/[[:alpha:]]:/\\|\\s\\+\\)"
- helm-pattern)
- (with-current-buffer (window-buffer (minibuffer-window)) (eolp))
- (not (string-match helm-ff-url-regexp helm-pattern)))
- (let* ((match (match-string 0 helm-pattern))
- (input (cond ((string= match "/./")
- (expand-file-name default-directory))
- ((string= helm-pattern "/../") "/")
- ((string-match-p "\\`/\\$" match)
- (let ((sub (substitute-in-file-name match)))
- (if (file-directory-p sub)
- sub (replace-regexp-in-string "/\\'" "" sub))))
- (t (expand-file-name
- (helm-substitute-in-filename helm-pattern)
- ;; [Windows] On UNC paths "/" expand to current machine,
- ;; so use the root of current Drive. (i.e "C:/")
- (and (memq system-type '(windows-nt ms-dos))
- (getenv "SystemDrive")) ; nil on Unix.
- )))))
- (if (file-directory-p input)
- (setq helm-ff-default-directory
- (setq input (file-name-as-directory input)))
- (setq helm-ff-default-directory (file-name-as-directory
- (file-name-directory input))))
- (with-helm-window
- (helm-set-pattern input)
- (helm-check-minibuffer-input)))))
-
-(defun helm-substitute-in-filename (fname)
- "Substitute all parts of FNAME from start up to \"~/\" or \"/\".
-On windows system substitute from start up to \"/[[:lower:]]:/\".
-This function is needed for `helm-ff-auto-expand-to-home-or-root'
-and should be used carefully elsewhere, or not at all, using
-`substitute-in-file-name' instead."
- (if (and ffap-url-regexp
- (string-match-p ffap-url-regexp fname))
- fname
- (with-temp-buffer
- (insert fname)
- (goto-char (point-min))
- (skip-chars-forward "/") ;; Avoid infloop in UNC paths Issue #424
- (if (re-search-forward "~.*/?\\|//\\|/[[:alpha:]]:/" nil t)
- (let ((match (match-string 0)))
- (goto-char (if (or (string= match "//")
- (string-match-p "/[[:alpha:]]:/" match))
- (1+ (match-beginning 0))
- (match-beginning 0)))
- (buffer-substring-no-properties (point) (point-at-eol)))
- fname))))
-
-(add-hook 'helm-after-update-hook 'helm-ff-update-when-only-one-matched)
-(add-hook 'helm-after-update-hook 'helm-ff-auto-expand-to-home-or-root)
-
-(defun helm-point-file-in-dired (file)
- "Put point on filename FILE in dired buffer."
- (unless (and ffap-url-regexp
- (string-match-p ffap-url-regexp file))
- (let ((target (expand-file-name (helm-substitute-in-filename file))))
- (dired (file-name-directory target))
- (dired-goto-file target))))
-
-(defun helm-create-tramp-name (fname)
- "Build filename for `helm-pattern' like /su:: or /sudo::."
- (apply #'tramp-make-tramp-file-name
- (cl-loop with v = (tramp-dissect-file-name fname)
- for i across v collect i)))
-
-(cl-defun helm-ff-tramp-hostnames (&optional (pattern helm-pattern))
- "Get a list of hosts for tramp method found in `helm-pattern'.
-Argument PATTERN default to `helm-pattern', it is here only for debugging
-purpose."
- (when (string-match helm-tramp-file-name-regexp pattern)
- (let ((method (match-string 1 pattern))
- (tn (match-string 0 pattern))
- (all-methods (mapcar 'car tramp-methods)))
- (helm-fast-remove-dups
- (cl-loop for (f . h) in (tramp-get-completion-function method)
- append (cl-loop for e in (funcall f (car h))
- for host = (and (consp e) (cadr e))
- when (and host (not (member host all-methods)))
- collect (concat tn host)))
- :test 'equal))))
-
-(defun helm-ff-before-action-hook-fn ()
- "Exit helm when user try to execute action on an invalid tramp fname."
- (let ((cand (helm-get-selection)))
- (when (and (helm-file-completion-source-p)
- (stringp cand)
- (helm-ff-invalid-tramp-name-p cand) ; Check candidate.
- (helm-ff-invalid-tramp-name-p)) ; check helm-pattern.
- (error "Error: Unknown file or directory `%s'" cand))))
-(add-hook 'helm-before-action-hook 'helm-ff-before-action-hook-fn)
-
-(cl-defun helm-ff-invalid-tramp-name-p (&optional (pattern helm-pattern))
- "Return non--nil when PATTERN is an invalid tramp filename."
- (string= (helm-ff-set-pattern pattern)
- "Invalid tramp file name"))
-
-(defun helm-ff-set-pattern (pattern)
- "Handle tramp filenames in `helm-pattern'."
- (let ((methods (mapcar 'car tramp-methods))
- (reg "\\`/\\([^[/:]+\\|[^/]+]\\):.*:")
- cur-method tramp-name)
- ;; In some rare cases tramp can return a nil input,
- ;; so be sure pattern is a string for safety (Issue #476).
- (unless pattern (setq pattern ""))
- (cond ((string-match helm-ff-url-regexp pattern) pattern)
- ((string-match "\\`\\$" pattern)
- (substitute-in-file-name pattern))
- ((string= pattern "") "")
- ((string-match "\\`[.]\\{1,2\\}/\\'" pattern)
- (expand-file-name pattern))
- ((string-match ".*\\(~?/?[.]\\{1\\}/\\)\\'" pattern)
- (expand-file-name default-directory))
- ((string-match ".*\\(~//\\|//\\)\\'" pattern)
- (expand-file-name "/")) ; Expand to "/" or "c:/"
- ((string-match "\\`\\(~/\\|.*/~/\\)\\'" pattern)
- (expand-file-name "~/"))
- ;; Match "/method:maybe_hostname:~"
- ((and (string-match (concat reg "~") pattern)
- (setq cur-method (match-string 1 pattern))
- (member cur-method methods))
- (setq tramp-name (expand-file-name
- (helm-create-tramp-name
- (match-string 0 pattern))))
- (replace-match tramp-name nil t pattern))
- ;; Match "/method:maybe_hostname:"
- ((and (string-match reg pattern)
- (setq cur-method (match-string 1 pattern))
- (member cur-method methods))
- (setq tramp-name (helm-create-tramp-name
- (match-string 0 pattern)))
- (replace-match tramp-name nil t pattern))
- ;; Match "/hostname:"
- ((and (string-match helm-tramp-file-name-regexp pattern)
- (setq cur-method (match-string 1 pattern))
- (and cur-method (not (member cur-method methods))))
- (setq tramp-name (helm-create-tramp-name
- (match-string 0 pattern)))
- (replace-match tramp-name nil t pattern))
- ;; Match "/method:" in this case don't try to connect.
- ((and (not (string-match reg pattern))
- (string-match helm-tramp-file-name-regexp pattern)
- (member (match-string 1 pattern) methods))
- "Invalid tramp file name") ; Write in helm-buffer.
- ;; Return PATTERN unchanged.
- (t pattern))))
-
-(defun helm-find-files-get-candidates (&optional require-match)
- "Create candidate list for `helm-source-find-files'."
- (let* ((path (helm-ff-set-pattern helm-pattern))
- (dir-p (file-accessible-directory-p path))
- basedir
- invalid-basedir
- non-essential
- (tramp-verbose helm-tramp-verbose)) ; No tramp message when 0.
- (set-text-properties 0 (length path) nil path)
- ;; Issue #118 allow creation of newdir+newfile.
- (unless (or
- ;; A tramp file name not completed.
- (string= path "Invalid tramp file name")
- ;; An empty pattern
- (string= path "")
- ;; Check if base directory of PATH is valid.
- (helm-aif (file-name-directory path)
- ;; If PATH is a valid directory IT=PATH,
- ;; else IT=basedir of PATH.
- (file-directory-p it)))
- ;; BASEDIR is invalid, that's mean user is starting
- ;; to write a non--existing path in minibuffer
- ;; probably to create a 'new_dir' or a 'new_dir+new_file'.
- (setq invalid-basedir t))
- ;; Don't set now `helm-pattern' if `path' == "Invalid tramp file name"
- ;; like that the actual value (e.g /ssh:) is passed to
- ;; `helm-ff-tramp-hostnames'.
- (unless (or (string= path "Invalid tramp file name")
- invalid-basedir) ; Leave helm-pattern unchanged.
- (setq helm-ff-auto-update-flag ; [1]
- ;; Unless auto update is disabled at startup or
- ;; interactively, start auto updating only at third char.
- (unless (or (null helm-ff-auto-update-initial-value)
- (null helm-ff--auto-update-state)
- ;; But don't enable auto update when
- ;; deleting backward.
- helm-ff--deleting-char-backward
- (and dir-p (not (string-match-p "/\\'" path))))
- (or (>= (length (helm-basename path)) 3) dir-p)))
- (setq helm-pattern (helm-ff--transform-pattern-for-completion path))
- ;; This have to be set after [1] to allow deleting char backward.
- (setq basedir (expand-file-name
- (if (and dir-p helm-ff-auto-update-flag)
- ;; Add the final "/" to path
- ;; when `helm-ff-auto-update-flag' is enabled.
- (file-name-as-directory path)
- (if (string= path "") "/"
- (file-name-directory path)))))
- (setq helm-ff-default-directory
- (if (string= helm-pattern "")
- (expand-file-name "/") ; Expand to "/" or "c:/"
- ;; If path is an url *default-directory have to be nil.
- (unless (or (string-match helm-ff-url-regexp path)
- (and ffap-url-regexp
- (string-match ffap-url-regexp path)))
- basedir))))
- (cond ((string= path "Invalid tramp file name")
- (or (helm-ff-tramp-hostnames) ; Hostnames completion.
- (prog2
- ;; `helm-pattern' have not been modified yet.
- ;; Set it here to the value of `path' that should be now
- ;; "Invalid tramp file name" and set the candidates list
- ;; to ("Invalid tramp file name") to make `helm-pattern'
- ;; match single candidate "Invalid tramp file name".
- (setq helm-pattern path)
- ;; "Invalid tramp file name" is now printed
- ;; in `helm-buffer'.
- (list path))))
- ((or (and (file-regular-p path)
- (eq last-repeatable-command 'helm-execute-persistent-action))
- ;; `ffap-url-regexp' don't match until url is complete.
- (string-match helm-ff-url-regexp path)
- invalid-basedir
- (and (not (file-exists-p path)) (string-match "/$" path))
- (and ffap-url-regexp (string-match ffap-url-regexp path)))
- (list path))
- ((string= path "") (helm-ff-directory-files "/" t))
- ;; Check here if directory is accessible (not working on Windows).
- ((and (file-directory-p path) (not (file-readable-p path)))
- (list (format "file-error: Opening directory permission denied `%s'" path)))
- ;; A fast expansion of PATH is made only if `helm-ff-auto-update-flag'
- ;; is enabled.
- ((and dir-p helm-ff-auto-update-flag)
- (helm-ff-directory-files path t))
- (t (append (unless (or require-match
- ;; When `helm-ff-auto-update-flag' has been
- ;; disabled, whe don't want PATH to be added on top
- ;; if it is a directory.
- dir-p)
- (list path))
- (helm-ff-directory-files basedir t))))))
-
-(defun helm-ff-directory-files (directory &optional full)
- "List contents of DIRECTORY.
-Argument FULL mean absolute path.
-It is same as `directory-files' but always returns the
-dotted filename '.' and '..' even on root directories in Windows
-systems."
- (setq directory (file-name-as-directory
- (expand-file-name directory)))
- (let* (file-error
- (ls (condition-case err
- (directory-files
- directory full directory-files-no-dot-files-regexp)
- ;; Handle file-error from here for Windows
- ;; because predicates like `file-readable-p' and friends
- ;; seem broken on emacs for Windows systems (always returns t).
- ;; This should never be called on GNU/Linux/Unix
- ;; as the error is properly intercepted in
- ;; `helm-find-files-get-candidates' by `file-readable-p'.
- (file-error
- (prog1
- (list (format "%s:%s"
- (car err)
- (mapconcat 'identity (cdr err) " ")))
- (setq file-error t)))))
- (dot (concat directory "."))
- (dot2 (concat directory "..")))
- (append (and (not file-error) (list dot dot2)) ls)))
-
-(defun helm-ff-handle-backslash (fname)
- ;; Allow creation of filenames containing a backslash.
- (cl-loop with bad = '((92 . ""))
- for i across fname
- for isbad = (assq i bad)
- if isbad concat (cdr isbad)
- else concat (string i)))
-
-(defun helm-ff-fuzzy-matching-p ()
- (and helm-ff-fuzzy-matching
- (not (memq helm-mm-matching-method '(multi1 multi3p)))))
-
-(defun helm-ff--transform-pattern-for-completion (pattern)
- "Maybe return PATTERN with it's basename modified as a regexp.
-This happen only when `helm-ff-fuzzy-matching' is enabled.
-This provide a similar behavior as `ido-enable-flex-matching'.
-See also `helm--mapconcat-pattern'.
-If PATTERN is an url returns it unmodified.
-When PATTERN contain a space fallback to multi-match.
-If basename contain one or more space fallback to multi-match.
-If PATTERN is a valid directory name,return PATTERN unchanged."
- ;; handle bad filenames containing a backslash.
- (setq pattern (helm-ff-handle-backslash pattern))
- (let ((bn (helm-basename pattern))
- (bd (or (helm-basedir pattern) ""))
- (dir-p (file-directory-p pattern))
- (tramp-p (cl-loop for (m . f) in tramp-methods
- thereis (string-match m pattern))))
- ;; Always regexp-quote base directory name to handle
- ;; crap dirnames such e.g bookmark+
- (cond
- ((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
- ;; 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).
- ;; 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))
- (string-match "\\s-" bn)) ; Fall back to multi-match.
- (concat (regexp-quote bd) bn))
- ((or (string-match "[*][.]?.*" bn) ; Allow entering wilcard.
- (string-match "/$" pattern) ; Allow mkdir.
- (string-match helm-ff-url-regexp pattern)
- (and (string= helm-ff-default-directory "/") tramp-p))
- ;; Don't treat wildcards ("*") as regexp char.
- ;; (e.g ./foo/*.el => ./foo/[*].el)
- (concat (regexp-quote bd)
- (replace-regexp-in-string "[*]" "[*]" bn)))
- (t (concat (regexp-quote bd)
- (if (>= (length bn) 2) ; wait 2nd char before concating.
- (helm--mapconcat-pattern bn)
- (concat ".*" (regexp-quote bn))))))))
-
-(defun helm-dir-is-dot (dir)
- (string-match "\\(?:/\\|\\`\\)\\.\\{1,2\\}\\'" dir))
-
-(defun helm-ff-save-history ()
- "Store the last value of `helm-ff-default-directory' in `helm-ff-history'.
-Note that only existing directories are saved here."
- (when (and helm-ff-default-directory
- (helm-file-completion-source-p)
- (file-directory-p helm-ff-default-directory))
- (set-text-properties 0 (length helm-ff-default-directory)
- nil helm-ff-default-directory)
- (push helm-ff-default-directory helm-ff-history)))
-(add-hook 'helm-cleanup-hook 'helm-ff-save-history)
-
-(defun helm-files-save-file-name-history (&optional force)
- "Save selected file to `file-name-history'."
- (let ((src-name (assoc-default 'name (helm-get-current-source))))
- (when (or force (helm-file-completion-source-p)
- (member src-name helm-files-save-history-extra-sources))
- (let ((mkd (helm-marked-candidates))
- (history-delete-duplicates t))
- (cl-loop for sel in mkd
- when (and sel
- (stringp sel)
- (file-exists-p sel)
- (not (file-directory-p sel)))
- do
- ;; we use `abbreviate-file-name' here because
- ;; other parts of Emacs seems to,
- ;; and we don't want to introduce duplicates.
- (add-to-history 'file-name-history
- (abbreviate-file-name sel)))))))
-(add-hook 'helm-exit-minibuffer-hook 'helm-files-save-file-name-history)
-
-(defun helm-ff-valid-symlink-p (file)
- (helm-aif (condition-case-unless-debug nil
- ;; `file-truename' send error
- ;; on cyclic symlinks (Issue #692).
- (file-truename file)
- (error nil))
- (file-exists-p it)))
-
-(defun helm-get-default-mode-for-file (filename)
- "Return the default mode to open FILENAME."
- (let ((mode (cl-loop for (r . m) in auto-mode-alist
- thereis (and (string-match r filename) m))))
- (or (and (symbolp mode) mode) "Fundamental")))
-
-(defun helm-ff-properties (candidate)
- "Show file properties of CANDIDATE in a tooltip or message."
- (let* ((all (helm-file-attributes candidate))
- (dired-line (helm-file-attributes
- candidate :dired t :human-size t))
- (type (cl-getf all :type))
- (mode-type (cl-getf all :mode-type))
- (owner (cl-getf all :uid))
- (owner-right (cl-getf all :user t))
- (group (cl-getf all :gid))
- (group-right (cl-getf all :group))
- (other-right (cl-getf all :other))
- (size (helm-file-human-size (cl-getf all :size)))
- (modif (cl-getf all :modif-time))
- (access (cl-getf all :access-time))
- (ext (helm-get-default-program-for-file candidate))
- (tooltip-hide-delay (or helm-tooltip-hide-delay tooltip-hide-delay)))
- (if (and (window-system) tooltip-mode)
- (tooltip-show
- (concat
- (helm-basename candidate) "\n"
- dired-line "\n"
- (format "Mode: %s\n" (helm-get-default-mode-for-file candidate))
- (format "Ext prog: %s\n" (or (and ext (replace-regexp-in-string
- " %s" "" ext))
- "Not defined"))
- (format "Type: %s: %s\n" type mode-type)
- (when (string= type "symlink")
- (format "True name: '%s'\n"
- (cond ((string-match "^\.#" (helm-basename candidate))
- "Autosave symlink")
- ((helm-ff-valid-symlink-p candidate)
- (file-truename candidate))
- (t "Invalid Symlink"))))
- (format "Owner: %s: %s\n" owner owner-right)
- (format "Group: %s: %s\n" group group-right)
- (format "Others: %s\n" other-right)
- (format "Size: %s\n" size)
- (format "Modified: %s\n" modif)
- (format "Accessed: %s\n" access)))
- (message dired-line) (sit-for 5))))
-
-(defun helm-ff-properties-persistent ()
- "Show properties without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'properties-action '(helm-ff-properties . never-split))
- (helm-execute-persistent-action 'properties-action)))
-
-(defun helm-ff-persistent-delete ()
- "Delete current candidate without quitting."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'quick-delete '(helm-ff-quick-delete . never-split))
- (helm-execute-persistent-action 'quick-delete)))
-
-(defun helm-ff-dot-file-p (file)
- "Check if FILE is `.' or `..'."
- (member (helm-basename file) '("." "..")))
-
-(defun helm-ff-quick-delete (_candidate)
- "Delete file CANDIDATE without quitting."
- (let ((marked (helm-marked-candidates)))
- (unwind-protect
- (save-selected-window
- (cl-loop for c in marked do
- (progn (helm-preselect
- (if (and helm-ff-transformer-show-only-basename
- (not (helm-ff-dot-file-p c)))
- (helm-basename c) c))
- (when (y-or-n-p
- (format "Really Delete file `%s'? " c))
- (helm-delete-file
- c helm-ff-signal-error-on-dot-files 'synchro)
- (helm-delete-current-selection)
- (message nil)))))
- (with-helm-buffer
- (setq helm-marked-candidates nil
- helm-visible-mark-overlays nil))
- (helm-force-update
- (let ((presel (helm-get-selection)))
- (regexp-quote (if (and helm-ff-transformer-show-only-basename
- (not (helm-ff-dot-file-p presel)))
- (helm-basename presel) presel)))))))
-
-(defun helm-ff-kill-buffer-fname (candidate)
- (let* ((buf (get-file-buffer candidate))
- (buf-name (buffer-name buf)))
- (cond ((and buf (eq buf (get-buffer helm-current-buffer)))
- (user-error
- "Can't kill `helm-current-buffer' without quitting session"))
- (buf (kill-buffer buf) (message "Buffer `%s' killed" buf-name))
- (t (message "No buffer to kill")))))
-
-(defun helm-ff-kill-or-find-buffer-fname (candidate)
- "Find file CANDIDATE or kill it's buffer if it is visible.
-Never kill `helm-current-buffer'.
-Never kill buffer modified.
-This is called normally on third hit of \
-\\<helm-map>\\[helm-execute-persistent-action]
-in `helm-find-files-persistent-action'."
- (let* ((buf (get-file-buffer candidate))
- (buf-name (buffer-name buf))
- (win (get-buffer-window buf))
- (helm--reading-passwd-or-string t))
- (cond ((and buf win (eq buf (get-buffer helm-current-buffer)))
- (user-error
- "Can't kill `helm-current-buffer' without quitting session"))
- ((and buf win (buffer-modified-p buf))
- (message "Can't kill modified buffer, please save it before"))
- ((and buf win)
- (kill-buffer buf)
- (set-window-buffer win helm-current-buffer)
- (message "Buffer `%s' killed" buf-name))
- (t (find-file candidate)))))
-
-(defun helm-ff-run-kill-buffer-persistent ()
- "Execute `helm-ff-kill-buffer-fname' without quitting."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'kill-buffer-fname 'helm-ff-kill-buffer-fname)
- (helm-execute-persistent-action 'kill-buffer-fname)))
-
-(defun helm-ff-prefix-filename (fname &optional file-or-symlinkp new-file)
- "Return filename FNAME maybe prefixed with [?] or [@].
-If FILE-OR-SYMLINKP is non--nil this mean we assume FNAME is an
-existing filename or valid symlink and there is no need to test it.
-NEW-FILE when non--nil mean FNAME is a non existing file and
-return FNAME prefixed with [?]."
- (let* ((prefix-new (propertize
- " " 'display
- (propertize "[?]" 'face 'helm-ff-prefix)))
- (prefix-url (propertize
- " " 'display
- (propertize "[@]" 'face 'helm-ff-prefix))))
- (cond (file-or-symlinkp fname)
- ((or (string-match helm-ff-url-regexp fname)
- (and ffap-url-regexp (string-match ffap-url-regexp fname)))
- (concat prefix-url " " fname))
- (new-file (concat prefix-new " " fname)))))
-
-(defun helm-ff-score-candidate-for-pattern (str pattern)
- (if (member str '("." ".."))
- 200
- (helm-score-candidate-for-pattern str pattern)))
-
-(defun helm-ff-sort-candidates (candidates _source)
- "Sort function for `helm-source-find-files'.
-Return candidates prefixed with basename of `helm-input' first."
- (if (or (and (file-directory-p helm-input)
- (string-match "/\\'" helm-input))
- (string-match "\\`\\$" helm-input)
- (null candidates))
- candidates
- (let* ((c1 (car candidates))
- (cand1real (if (consp c1) (cdr c1) c1))
- (cand1 (unless (file-exists-p cand1real) c1))
- (rest-cand (if cand1 (cdr candidates) candidates))
- (memo-src (make-hash-table :test 'equal))
- (all (sort rest-cand
- (lambda (s1 s2)
- (let* ((score (lambda (str)
- (helm-ff-score-candidate-for-pattern
- str (helm-basename helm-input))))
- (bn1 (helm-basename (if (consp s1) (cdr s1) s1)))
- (bn2 (helm-basename (if (consp s2) (cdr s2) s2)))
- (sc1 (or (gethash bn1 memo-src)
- (puthash bn1 (funcall score bn1) memo-src)))
- (sc2 (or (gethash bn2 memo-src)
- (puthash bn2 (funcall score bn2) memo-src))))
- (cond ((= sc1 sc2)
- (< (string-width bn1)
- (string-width bn2)))
- ((> sc1 sc2))))))))
- (if cand1 (cons cand1 all) all))))
-
-(defun helm-ff-filter-candidate-one-by-one (file)
- "`filter-one-by-one' Transformer function for `helm-source-find-files'."
- ;; Handle boring files
- (unless (and helm-ff-skip-boring-files
- (cl-loop for r in helm-boring-file-regexp-list
- ;; Prevent user doing silly thing like
- ;; adding the dotted files to boring regexps (#924).
- thereis (and (not (string-match "\\.$" file))
- (string-match r file))))
- ;; Handle tramp files.
- (if (and (string-match helm-tramp-file-name-regexp helm-pattern)
- helm-ff-tramp-not-fancy)
- (if helm-ff-transformer-show-only-basename
- (if (helm-dir-is-dot file)
- file
- (cons (or (helm-ff-get-host-from-tramp-invalid-fname file)
- (helm-basename file))
- file))
- file)
- ;; Now highlight.
- (let* ((disp (if (and helm-ff-transformer-show-only-basename
- (not (helm-dir-is-dot file))
- (not (and ffap-url-regexp
- (string-match ffap-url-regexp file)))
- (not (string-match helm-ff-url-regexp file)))
- (or (helm-ff-get-host-from-tramp-invalid-fname file)
- (helm-basename file)) file))
- (attr (file-attributes file))
- (type (car attr)))
-
- (cond ((string-match "file-error" file) file)
- ( ;; A not already saved file.
- (and (stringp type)
- (not (helm-ff-valid-symlink-p file))
- (not (string-match "^\.#" (helm-basename file))))
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-invalid-symlink) t)
- file))
- ;; A dotted directory symlinked.
- ((and (helm-ff-dot-file-p file) (stringp type))
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-dotted-symlink-directory) t)
- file))
- ;; A dotted directory.
- ((helm-ff-dot-file-p file)
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-dotted-directory) t)
- file))
- ;; A symlink.
- ((stringp type)
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-symlink) t)
- file))
- ;; A directory.
- ((eq t type)
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-directory) t)
- file))
- ;; An executable file.
- ((and attr (string-match "x" (nth 8 attr)))
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-executable) t)
- file))
- ;; A file.
- ((and attr (null type))
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-file) t)
- file))
- ;; A non--existing file.
- (t
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-file) nil 'new-file)
- file)))))))
-
-(defun helm-find-files-action-transformer (actions candidate)
- "Action transformer for `helm-source-find-files'."
- (let ((str-at-point (with-helm-current-buffer
- (buffer-substring-no-properties
- (point-at-bol) (point-at-eol)))))
- (cond ((with-helm-current-buffer
- (eq major-mode 'message-mode))
- (append actions
- '(("Gnus attach file(s)" . helm-ff-gnus-attach-files))))
- ((save-match-data
- (and ffap-url-regexp
- (not (string-match-p ffap-url-regexp str-at-point))
- (string-match ":\\([0-9]+:?\\)" str-at-point)
- ))
- (append '(("Find file to line number" . helm-ff-goto-linum))
- actions))
- ((string-match (image-file-name-regexp) candidate)
- (append actions
- '(("Rotate image right `M-r'" . helm-ff-rotate-image-right)
- ("Rotate image left `M-l'" . helm-ff-rotate-image-left))))
- ((string-match "\.el$" (helm-aif (helm-marked-candidates)
- (car it) candidate))
- (append actions
- '(("Byte compile lisp file(s) `M-B, C-u to load'"
- . helm-find-files-byte-compile)
- ("Load File(s) `M-L'" . helm-find-files-load-files))))
- ((and (string-match "\.html?$" candidate)
- (file-exists-p candidate))
- (append actions
- '(("Browse url file" . browse-url-of-file))))
- ((or (string= (file-name-extension candidate) "pdf")
- (string= (file-name-extension candidate) "PDF"))
- (append actions
- '(("Pdfgrep File(s)" . helm-ff-pdfgrep))))
- (t actions))))
-
-(defun helm-ff-goto-linum (candidate)
- "Find file CANDIDATE and maybe jump to line number found in fname at point.
-line number should be added at end of fname preceded with \":\".
-e.g \"foo:12\"."
- (let ((linum (with-helm-current-buffer
- (let ((str (buffer-substring-no-properties
- (point-at-bol) (point-at-eol))))
- (when (string-match ":\\([0-9]+:?\\)" str)
- (match-string 1 str))))))
- (find-file candidate)
- (and linum (not (string= linum ""))
- (helm-goto-line (string-to-number linum) t))))
-
-(defun helm-ff-gnus-attach-files (_candidate)
- "Run `gnus-dired-attach' on `helm-marked-candidates' or CANDIDATE."
- (require 'gnus-dired)
- (let ((flist (helm-marked-candidates :with-wildcard t)))
- (gnus-dired-attach flist)))
-
-(defvar image-dired-display-image-buffer)
-(defun helm-ff-rotate-current-image-1 (file &optional num-arg)
- "Rotate current image at NUM-ARG degrees.
-This is a destructive operation on FILE made by external tool mogrify."
- (setq file (file-truename file)) ; For symlinked images.
- ;; When FILE is not an image-file, do nothing.
- (when (string-match (image-file-name-regexp) file)
- (if (executable-find "mogrify")
- (progn
- (shell-command (format "mogrify -rotate %s %s"
- (or num-arg 90)
- (shell-quote-argument file)))
- (when (buffer-live-p image-dired-display-image-buffer)
- (kill-buffer image-dired-display-image-buffer))
- (image-dired-display-image file)
- (message nil)
- (display-buffer (get-buffer image-dired-display-image-buffer)))
- (error "mogrify not found"))))
-
-(defun helm-ff-rotate-image-left (candidate)
- "Rotate image file CANDIDATE left.
-This affect directly file CANDIDATE."
- (helm-ff-rotate-current-image-1 candidate -90))
-
-(defun helm-ff-rotate-image-right (candidate)
- "Rotate image file CANDIDATE right.
-This affect directly file CANDIDATE."
- (helm-ff-rotate-current-image-1 candidate))
-
-(defun helm-ff-rotate-left-persistent ()
- "Rotate image left without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'image-action1 'helm-ff-rotate-image-left)
- (helm-execute-persistent-action 'image-action1)))
-
-(defun helm-ff-rotate-right-persistent ()
- "Rotate image right without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'image-action2 'helm-ff-rotate-image-right)
- (helm-execute-persistent-action 'image-action2)))
-
-(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
- (executable-find helm-ff-exif-data-program))
- (shell-command-to-string (format "%s %s %s"
- helm-ff-exif-data-program
- helm-ff-exif-data-program-args
- candidate))
- (format "No program %s found to extract exif"
- helm-ff-exif-data-program)))
-
-(defun helm-find-files-persistent-action (candidate)
- "Open subtree CANDIDATE without quitting helm.
-If CANDIDATE is not a directory expand CANDIDATE filename.
-If CANDIDATE is alone, open file CANDIDATE filename.
-That's mean:
-First hit on C-j expand CANDIDATE second hit open file.
-If a prefix arg is given or `helm-follow-mode' is on open file."
- (let* ((follow (or (buffer-local-value
- 'helm-follow-mode
- (get-buffer-create helm-buffer))
- helm--temp-follow-flag))
- (new-pattern (helm-get-selection))
- (num-lines-buf (with-current-buffer helm-buffer
- (count-lines (point-min) (point-max))))
- (insert-in-minibuffer (lambda (fname)
- (with-selected-window (minibuffer-window)
- (unless follow
- (delete-minibuffer-contents)
- (set-text-properties 0 (length fname)
- nil fname)
- (insert fname))))))
- (cond ((and (helm-ff-invalid-tramp-name-p)
- (string-match helm-tramp-file-name-regexp candidate))
- ;; First hit insert hostname and
- ;; second hit insert ":" and expand.
- (if (string= candidate helm-pattern)
- (funcall insert-in-minibuffer (concat candidate ":"))
- (funcall insert-in-minibuffer candidate)))
- (;; A symlink directory, expand it but not to its truename
- ;; unless a prefix arg is given.
- (and (file-directory-p candidate) (file-symlink-p candidate))
- (funcall insert-in-minibuffer
- (file-name-as-directory
- (if current-prefix-arg
- (file-truename (expand-file-name candidate))
- (expand-file-name candidate)))))
- ;; A directory, open it.
- ((file-directory-p candidate)
- (when (string= (helm-basename candidate) "..")
- (setq helm-ff-last-expanded helm-ff-default-directory))
- (funcall insert-in-minibuffer (file-name-as-directory
- (expand-file-name candidate))))
- ;; A symlink file, expand to it's true name. (first hit)
- ((and (file-symlink-p candidate) (not current-prefix-arg) (not follow))
- (funcall insert-in-minibuffer (file-truename candidate)))
- ;; A regular file, expand it, (first hit)
- ((and (>= num-lines-buf 3) (not current-prefix-arg) (not follow))
- (setq helm-pattern "") ; Force update.
- (funcall insert-in-minibuffer new-pattern))
- ;; An image file and it is the second hit on C-j,
- ;; show the file in `image-dired'.
- ((string-match (image-file-name-regexp) candidate)
- (when (buffer-live-p (get-buffer image-dired-display-image-buffer))
- (kill-buffer image-dired-display-image-buffer))
- ;; Fix emacs bug never fixed upstream.
- (unless (file-directory-p image-dired-dir)
- (make-directory image-dired-dir))
- (image-dired-display-image candidate)
- (message nil)
- (switch-to-buffer image-dired-display-image-buffer)
- (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.
- ((and helm-ff-avfs-directory
- (string-match
- (regexp-quote (expand-file-name helm-ff-avfs-directory))
- (file-name-directory candidate))
- (helm-ff-file-compressed-p candidate))
- (funcall insert-in-minibuffer (concat candidate "#")))
- ;; On second hit we open file.
- ;; On Third hit we kill it's buffer maybe.
- (t
- (helm-ff-kill-or-find-buffer-fname candidate)))))
-
-(defun helm-ff-file-compressed-p (candidate)
- "Whether CANDIDATE is a compressed file or not."
- (member (file-name-extension candidate)
- helm-ff-file-compressed-list))
-
-(defun helm-insert-file-name-completion-at-point (candidate)
- "Insert file name completion at point."
- (with-helm-current-buffer
- (if buffer-read-only
- (error "Error: Buffer `%s' is read-only" (buffer-name))
- (let* ((end (point))
- (tap (thing-at-point 'filename))
- (guess (and (stringp tap) (substring-no-properties tap)))
- (beg (- (point) (length guess)))
- (full-path-p (and (stringp guess)
- (or (string-match-p
- (concat "^" (getenv "HOME"))
- guess)
- (string-match-p
- "\\`\\(/\\|[[:lower:][:upper:]]:/\\)"
- guess)))))
- (set-text-properties 0 (length candidate) nil candidate)
- (if (and guess (not (string= guess ""))
- (or (string-match "^\\(~/\\|/\\|[[:lower:][:upper:]]:/\\)"
- guess)
- (file-exists-p candidate)))
- (progn
- (delete-region beg end)
- (insert (cond (full-path-p
- (expand-file-name candidate))
- ((string= (match-string 1 guess) "~/")
- (abbreviate-file-name candidate))
- (t (file-relative-name candidate)))))
- (insert (cond ((equal helm-current-prefix-arg '(4))
- (abbreviate-file-name candidate))
- ((equal helm-current-prefix-arg '(16))
- (file-relative-name candidate))
- (t candidate))))))))
-
-(cl-defun helm-find-files-history (&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'."
- (let ((history (when helm-ff-history
- (helm-fast-remove-dups helm-ff-history
- :test 'equal))))
- (when history
- (setq helm-ff-history
- (if (>= (length history) helm-ff-history-max-length)
- (cl-subseq history 0 helm-ff-history-max-length)
- history))
- (if comp-read
- (helm-comp-read
- "Switch to Directory: "
- helm-ff-history
- :name "Helm Find Files History"
- :must-match t)
- helm-ff-history))))
-
-(defun helm-find-files-1 (fname &optional preselect)
- "Find FNAME with `helm' completion.
-Like `find-file' but with `helm' support.
-Use it for non--interactive calls of `helm-find-files'."
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (setq helm-find-files--toggle-bookmark nil)
- (let* ( ;; Be sure we don't erase the precedent minibuffer if some.
- (helm-ff-auto-update-initial-value
- (and helm-ff-auto-update-initial-value
- (not (minibuffer-window-active-p (minibuffer-window)))))
- (tap (thing-at-point 'filename))
- (def (and tap (or (file-remote-p tap)
- (expand-file-name tap)))))
- (unless helm-source-find-files
- (setq helm-source-find-files (helm-make-source
- "Find Files" 'helm-source-ffiles)))
- (unwind-protect
- (helm :sources 'helm-source-find-files
- :input fname
- :case-fold-search helm-file-name-case-fold-search
- :preselect preselect
- :ff-transformer-show-only-basename
- helm-ff-transformer-show-only-basename
- :default def
- :prompt "Find Files or Url: "
- :buffer "*Helm Find Files*")
- (setq helm-ff-default-directory nil))))
-
-(defun helm-find-files-toggle-to-bookmark ()
- "Toggle helm-bookmark for `helm-find-files' and `helm-find-files.'"
- (interactive)
- (with-helm-buffer
- (if (setq helm-find-files--toggle-bookmark
- (not helm-find-files--toggle-bookmark))
- (progn
- (helm-set-pattern "" t)
- (helm-set-sources '(helm-source-bookmark-helm-find-files)))
- ;; Switch back to helm-find-files.
- (helm-set-pattern "./" t) ; Back to initial directory of hff session.
- (helm-set-sources '(helm-source-find-files))
- (helm--maybe-update-keymap))))
-
-(defun helm-find-files-initial-input (&optional input)
- "Return INPUT if present, otherwise try to guess it."
- (let ((ffap-machine-p-known 'reject)
- (ffap-alist (and helm-ff-guess-ffap-filenames ffap-alist))
- (ffap-url-regexp (and helm-ff-guess-ffap-urls ffap-url-regexp)))
- (unless (eq major-mode 'image-mode)
- (or (and input (or (and (file-remote-p input) input)
- (expand-file-name input)))
- (helm-find-files-input
- (ffap-guesser)
- (thing-at-point 'filename))))))
-
-(defun helm-find-files-input (file-at-pt thing-at-pt)
- "Try to guess a default input for `helm-find-files'."
- (let* ((non-essential t)
- (remp (or (and file-at-pt (file-remote-p file-at-pt))
- (and thing-at-pt (file-remote-p thing-at-pt))))
- (def-dir (helm-current-directory))
- (urlp (and file-at-pt ffap-url-regexp
- (string-match ffap-url-regexp file-at-pt)))
- (lib (when helm-ff-search-library-in-sexp
- (helm-find-library-at-point)))
- (hlink (helm-ff-find-url-at-point))
- (file-p (and file-at-pt
- (not (string= file-at-pt ""))
- (not remp)
- (file-exists-p file-at-pt)
- thing-at-pt
- (not (string= thing-at-pt ""))
- (file-exists-p
- (file-name-directory
- (expand-file-name thing-at-pt def-dir))))))
- (cond (lib) ; e.g we are inside a require sexp.
- (hlink) ; String at point is an hyperlink.
- (file-p ; a regular file
- (helm-aif (ffap-file-at-point) (expand-file-name it)))
- (urlp file-at-pt) ; possibly an url or email.
- ((and file-at-pt
- (not remp)
- (file-exists-p file-at-pt))
- file-at-pt))))
-
-(defun helm-ff-find-url-at-point ()
- "Try to find link to an url in text-property at point."
- (let* ((he (get-text-property (point) 'help-echo))
- (ov (overlays-at (point)))
- (ov-he (and ov (overlay-get
- (car (overlays-at (point))) 'help-echo)))
- (w3m-l (get-text-property (point) 'w3m-href-anchor))
- (nt-prop (get-text-property (point) 'nt-link)))
- ;; Org link.
- (when (and (stringp he) (string-match "^LINK: " he))
- (setq he (replace-match "" t t he)))
- (cl-loop for i in (list he ov-he w3m-l nt-prop)
- thereis (and (stringp i) ffap-url-regexp (string-match ffap-url-regexp i) i))))
-
-(defun helm-find-library-at-point ()
- "Try to find library path at point.
-Find inside `require' and `declare-function' sexp."
- (require 'find-func)
- (let* ((beg-sexp (save-excursion (search-backward "(" (point-at-bol) t)))
- (end-sexp (save-excursion (search-forward ")" (point-at-eol) t)))
- (sexp (and beg-sexp end-sexp
- (buffer-substring-no-properties
- (1+ beg-sexp) (1- end-sexp)))))
- (ignore-errors
- (cond ((and sexp (string-match "require \'.+[^)]" sexp))
- (find-library-name
- (replace-regexp-in-string
- "'\\|\)\\|\(" ""
- ;; If require use third arg, ignore it,
- ;; always use library path found in `load-path'.
- (cl-second (split-string (match-string 0 sexp))))))
- ((and sexp (string-match-p "^declare-function" sexp))
- (find-library-name
- (replace-regexp-in-string
- "\"\\|ext:" ""
- (cl-third (split-string sexp)))))
- (t nil)))))
-
-\f
-;;; Handle copy, rename, symlink, relsymlink and hardlink from helm.
-;;
-;;
-(defun helm-ff--valid-default-directory ()
- (with-helm-current-buffer
- (cl-loop for b in (buffer-list)
- for cd = (with-current-buffer b default-directory)
- when (eq (car (file-attributes cd)) t)
- return cd)))
-
-(defvar dired-async-mode)
-(cl-defun helm-dired-action (candidate
- &key action follow (files (dired-get-marked-files)))
- "Execute ACTION on FILES to CANDIDATE.
-Where ACTION is a symbol that can be one of:
-'copy, 'rename, 'symlink,'relsymlink, 'hardlink.
-Argument FOLLOW when non--nil specify to follow FILES to destination for the actions
-copy and rename."
- (when (get-buffer dired-log-buffer) (kill-buffer dired-log-buffer))
- ;; When default-directory in current-buffer is an invalid directory,
- ;; (e.g buffer-file directory have been renamed somewhere else)
- ;; be sure to use a valid value to give to dired-create-file.
- ;; i.e start-process is creating a process buffer based on default-directory.
- (let ((default-directory (helm-ff--valid-default-directory))
- (fn (cl-case action
- (copy 'dired-copy-file)
- (rename 'dired-rename-file)
- (symlink 'make-symbolic-link)
- (relsymlink 'dired-make-relative-symlink)
- (hardlink 'dired-hardlink)))
- (marker (cl-case action
- ((copy rename) dired-keep-marker-copy)
- (symlink dired-keep-marker-symlink)
- (relsymlink dired-keep-marker-relsymlink)
- (hardlink dired-keep-marker-hardlink)))
- (dirflag (and (= (length files) 1)
- (file-directory-p (car files))
- (not (file-directory-p candidate))))
- (dired-async-state (if (and (boundp 'dired-async-mode)
- dired-async-mode)
- 1 -1)))
- (and follow (fboundp 'dired-async-mode) (dired-async-mode -1))
- (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.
- (lambda (from)
- (expand-file-name (file-name-nondirectory from) candidate))
- (lambda (_from) candidate))
- 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)))
- 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)))
- (unwind-protect
- (progn
- (setq helm-ff-cand-to-mark
- (helm-get-dest-fnames-from-list files candidate dirflag))
- (with-helm-after-update-hook (helm-ff-maybe-mark-candidates))
- (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)))))
- (setq helm-ff-cand-to-mark nil))))))
-
-(defun helm-get-dest-fnames-from-list (flist dest-cand rename-dir-flag)
- "Transform filenames of FLIST to abs of DEST-CAND.
-If RENAME-DIR-FLAG is non--nil collect the `directory-file-name' of transformed
-members of FLIST."
- ;; At this point files have been renamed/copied at destination.
- ;; That's mean DEST-CAND exists.
- (cl-loop
- with dest = (expand-file-name dest-cand)
- for src in flist
- for basename-src = (helm-basename src)
- for fname = (cond (rename-dir-flag (directory-file-name dest))
- ((file-directory-p dest)
- (concat (file-name-as-directory dest) basename-src))
- (t dest))
- when (file-exists-p fname)
- collect fname into tmp-list
- finally return (sort tmp-list 'string<)))
-
-(defun helm-ff-maybe-mark-candidates ()
- "Mark all candidates of list `helm-ff-cand-to-mark'.
-This is used when copying/renaming/symlinking etc... and
-following files to destination."
- (when (and (string= (assoc-default 'name (helm-get-current-source))
- (assoc-default 'name helm-source-find-files))
- helm-ff-cand-to-mark)
- (with-helm-window
- (while helm-ff-cand-to-mark
- (if (string= (car helm-ff-cand-to-mark) (helm-get-selection))
- (progn
- (helm-make-visible-mark)
- (helm-next-line)
- (setq helm-ff-cand-to-mark (cdr helm-ff-cand-to-mark)))
- (helm-next-line)))
- (unless (helm-this-visible-mark)
- (helm-prev-visible-mark)))))
-
-\f
-;;; Routines for files
-;;
-;;
-(defun helm-file-buffers (filename)
- "Returns a list of buffer names corresponding to FILENAME."
- (cl-loop with name = (expand-file-name filename)
- for buf in (buffer-list)
- for bfn = (buffer-file-name buf)
- when (and bfn (string= name bfn))
- collect (buffer-name buf)))
-
-(defun helm-delete-file (file &optional error-if-dot-file-p synchro)
- "Delete the given file after querying the user.
-Ask to kill buffers associated with that file, too."
- (when (and error-if-dot-file-p
- (helm-ff-dot-file-p file))
- (error "Error: Cannot operate on `.' or `..'"))
- (let ((buffers (helm-file-buffers file))
- (helm--reading-passwd-or-string t))
- (if (or (< emacs-major-version 24) synchro)
- ;; `dired-delete-file' in Emacs versions < 24
- ;; doesn't support delete-by-moving-to-trash
- ;; so use `delete-directory' and `delete-file'
- ;; that handle it.
- (cond ((and (not (file-symlink-p file))
- (file-directory-p file)
- (directory-files file t dired-re-no-dot))
- (when (y-or-n-p (format "Recursive delete of `%s'? " file))
- (delete-directory file 'recursive)))
- ((and (not (file-symlink-p file))
- (file-directory-p file))
- (delete-directory file))
- (t (delete-file file)))
- (dired-delete-file
- file dired-recursive-deletes delete-by-moving-to-trash))
- (when buffers
- (cl-dolist (buf buffers)
- (when (y-or-n-p (format "Kill buffer %s, too? " buf))
- (kill-buffer buf))))))
-
-(defun helm-delete-marked-files (_ignore)
- (let* ((files (helm-marked-candidates :with-wildcard t))
- (len (length files)))
- (with-helm-display-marked-candidates
- helm-marked-buffer-name
- (mapcar (lambda (f)
- (if (file-directory-p f)
- (concat (helm-basename f) "/")
- (helm-basename f)))
- files)
- (if (not (y-or-n-p (format "Delete *%s File(s)" len)))
- (message "(No deletions performed)")
- (cl-dolist (i files)
- (set-text-properties 0 (length i) nil i)
- (helm-delete-file i helm-ff-signal-error-on-dot-files))
- (message "%s File(s) deleted" len)))))
-
-(defun helm-find-file-or-marked (candidate)
- "Open file CANDIDATE or open helm marked files in separate windows.
-Called with a prefix arg open files in background without selecting them."
- (let ((marked (helm-marked-candidates :with-wildcard t))
- (url-p (and ffap-url-regexp ; we should have only one candidate.
- (string-match ffap-url-regexp candidate)))
- (ffap-newfile-prompt helm-ff-newfile-prompt-p)
- (find-file-wildcards nil)
- (make-dir-fn
- (lambda (dir &optional helm-ff)
- (when (or (not confirm-nonexistent-file-or-buffer)
- (y-or-n-p (format "Create directory `%s'? " dir)))
- (let ((dirfname (directory-file-name dir)))
- (if (file-exists-p dirfname)
- (error
- "Mkdir: Unable to create directory `%s': file exists."
- (helm-basename dirfname))
- (make-directory dir 'parent)))
- (when helm-ff
- ;; Allow having this new dir in history
- ;; to be able to retrieve it immediately
- ;; if we want to e.g copy a file from somewhere in it.
- (setq helm-ff-default-directory
- (file-name-as-directory dir))
- (push helm-ff-default-directory helm-ff-history))
- (or (and helm-ff (helm-find-files-1 dir)) t))))
- (helm--reading-passwd-or-string t))
- (if (cdr marked)
- (if helm-current-prefix-arg
- (dired-simultaneous-find-file marked nil)
- (mapc 'find-file-noselect (cdr marked))
- (find-file (car marked)))
- (if (and (not (file-exists-p candidate))
- (not url-p)
- (string-match "/$" candidate))
- ;; A a non--existing filename ending with /
- ;; Create a directory and jump to it.
- (funcall make-dir-fn candidate 'helm-ff)
- ;; A non--existing filename NOT ending with / or
- ;; an existing filename, create or jump to it.
- ;; If the basedir of candidate doesn't exists,
- ;; ask for creating it.
- (let ((dir (and (not url-p) (helm-basedir candidate))))
- (find-file-at-point
- (cond ((and dir (file-directory-p dir))
- (substitute-in-file-name candidate))
- (url-p candidate)
- ((funcall make-dir-fn dir) candidate))))))))
-
-(defun helm-shadow-boring-files (files)
- "Files matching `helm-boring-file-regexp' will be
-displayed with the `file-name-shadow' face if available."
- (helm-shadow-entries files helm-boring-file-regexp-list))
-
-(defun helm-skip-boring-files (files)
- "Files matching `helm-boring-file-regexp' will be skipped."
- (helm-skip-entries files helm-boring-file-regexp-list))
-
-(defun helm-skip-current-file (files)
- "Current file will be skipped."
- (remove (buffer-file-name helm-current-buffer) files))
-
-(defun helm-w32-pathname-transformer (args)
- "Change undesirable features of windows pathnames to ones more acceptable to
-other candidate transformers."
- (if (eq system-type 'windows-nt)
- (helm-transform-mapcar
- (lambda (x)
- (replace-regexp-in-string
- "/cygdrive/\\(.\\)" "\\1:"
- (replace-regexp-in-string "\\\\" "/" x)))
- args)
- args))
-
-(defun helm-transform-file-load-el (actions candidate)
- "Add action to load the file CANDIDATE if it is an emacs lisp
-file. Else return ACTIONS unmodified."
- (if (member (file-name-extension candidate) '("el" "elc"))
- (append actions '(("Load Emacs Lisp File" . load-file)))
- actions))
-
-(defun helm-transform-file-browse-url (actions candidate)
- "Add an action to browse the file CANDIDATE if it is a html file or URL.
-Else return ACTIONS unmodified."
- (let ((browse-action '("Browse with Browser" . browse-url)))
- (cond ((string-match "^http\\|^ftp" candidate)
- (cons browse-action actions))
- ((string-match "\\.html?$" candidate)
- (append actions (list browse-action)))
- (t actions))))
-
-(defun helm-multi-files-toggle-to-locate ()
- (interactive)
- (with-helm-buffer
- (if (setq helm-multi-files--toggle-locate
- (not helm-multi-files--toggle-locate))
- (progn
- (helm-set-sources (unless (memq 'helm-source-locate
- helm-sources)
- (cons 'helm-source-locate helm-sources)))
- (helm-set-source-filter '(helm-source-locate)))
- (helm-kill-async-processes)
- (helm-set-sources (remove 'helm-source-locate
- helm-for-files-preferred-list))
- (helm-set-source-filter nil))))
-
-\f
-;;; List of files gleaned from every dired buffer
-;;
-;;
-(defun helm-files-in-all-dired-candidates ()
- (save-excursion
- (cl-loop for (f . b) in dired-buffers
- 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))))))
-
-;; (dired '("~/" "~/.emacs.d/.emacs-custom.el" "~/.emacs.d/.emacs.bmk"))
-
-(defclass helm-files-dired-source (helm-source-sync helm-type-file)
- ((candidates :initform #'helm-files-in-all-dired-candidates)))
-
-(defvar helm-source-files-in-all-dired
- (helm-make-source "Files in all dired buffer." 'helm-files-dired-source))
-
-\f
-;;; File Cache
-;;
-;;
-(defvar file-cache-alist)
-
-(defclass helm-file-cache (helm-source-in-buffer helm-type-file)
- ((init :initform (lambda () (require 'filecache)))
- (keymap :initform helm-generic-files-map)
- (help-message :initform helm-generic-file-help-message)))
-
-(defun helm-file-cache-get-candidates ()
- (cl-loop for item in file-cache-alist append
- (cl-destructuring-bind (base &rest dirs) item
- (cl-loop for dir in dirs collect
- (concat dir base)))))
-
-(defvar helm-source-file-cache nil)
-
-(defcustom helm-file-cache-fuzzy-match nil
- "Enable fuzzy matching in `helm-source-file-cache' when non--nil."
- :group 'helm-files
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-file-cache
- (helm-make-source "File Cache" 'helm-file-cache
- :fuzzy-match helm-file-cache-fuzzy-match
- :data 'helm-file-cache-get-candidates))))
-
-(cl-defun helm-file-cache-add-directory-recursively
- (dir &optional match (ignore-dirs t))
- (require 'filecache)
- (cl-loop for f in (helm-walk-directory
- dir
- :path 'full
- :directories nil
- :match match
- :skip-subdirs ignore-dirs)
- do (file-cache-add-file f)))
-
-(defun helm-ff-cache-add-file (_candidate)
- (require 'filecache)
- (let ((mkd (helm-marked-candidates :with-wildcard t)))
- (mapc 'file-cache-add-file mkd)))
-
-(defun helm-ff-file-cache-remove-file-1 (file)
- "Remove FILE from `file-cache-alist'."
- (let ((entry (assoc (helm-basename file) file-cache-alist))
- (dir (helm-basedir file))
- new-entry)
- (setq new-entry (remove dir entry))
- (when (= (length entry) 1)
- (setq new-entry nil))
- (setq file-cache-alist
- (cons new-entry (remove entry file-cache-alist)))))
-
-(defun helm-ff-file-cache-remove-file (_file)
- "Remove marked files from `file-cache-alist.'"
- (let ((mkd (helm-marked-candidates)))
- (mapc 'helm-ff-file-cache-remove-file-1 mkd)))
-
-(defun helm-transform-file-cache (actions _candidate)
- (let ((source (helm-get-current-source)))
- (if (string= (assoc-default 'name source) "File Cache")
- (append actions
- '(("Remove marked files from file-cache"
- . helm-ff-file-cache-remove-file)))
- actions)))
-
-\f
-;;; File name history
-;;
-;;
-(defvar helm-source-file-name-history
- (helm-build-sync-source "File Name History"
- :candidates 'file-name-history
- :persistent-action #'ignore
- :filtered-candidate-transformer #'helm-file-name-history-transformer
- :action 'helm-type-file-actions))
-
-(defvar helm-source--ff-file-name-history nil
- "[Internal] This source is build to be used with `helm-find-files'.
-Don't use it in your own code unless you know what you are doing.")
-
-(defun helm-file-name-history-transformer (candidates _source)
- (cl-loop for c in candidates collect
- (cond ((file-remote-p c)
- (cons (propertize c 'face 'helm-history-remote) c))
- ((file-exists-p c)
- (cons (propertize c 'face 'helm-ff-file) c))
- (t (cons (propertize c 'face 'helm-history-deleted) c)))))
-
-(defun helm-ff-file-name-history ()
- "Switch to `file-name-history' without quitting `helm-find-files'."
- (interactive)
- (unless helm-source--ff-file-name-history
- (setq helm-source--ff-file-name-history
- (helm-build-sync-source "File name history"
- :init (lambda ()
- (with-helm-alive-p
- (when helm-ff-file-name-history-use-recentf
- (require 'recentf)
- (or recentf-mode (recentf-mode 1)))))
- :candidates (lambda ()
- (if helm-ff-file-name-history-use-recentf
- recentf-list
- file-name-history))
- :fuzzy-match t
- :persistent-action 'ignore
- :migemo t
- :filtered-candidate-transformer 'helm-file-name-history-transformer
- :action (helm-make-actions
- "Find file" (lambda (candidate)
- (helm-set-pattern
- (expand-file-name candidate))
- (with-helm-after-update-hook (helm-exit-minibuffer)))
- "Find file in helm" (lambda (candidate)
- (helm-set-pattern
- (expand-file-name candidate)))))))
- (with-helm-alive-p
- (helm :sources 'helm-source--ff-file-name-history
- :buffer "*helm-file-name-history*"
- :allow-nest t
- :resume 'noresume)))
-
-;;; Recentf files
-;;
-;;
-(defvar helm-recentf--basename-flag nil)
-
-(defun helm-recentf-pattern-transformer (pattern)
- (let ((pattern-no-flag (replace-regexp-in-string " -b" "" pattern)))
- (cond ((and (string-match " " pattern-no-flag)
- (string-match " -b\\'" pattern))
- (setq helm-recentf--basename-flag t)
- pattern-no-flag)
- ((string-match "\\([^ ]*\\) -b\\'" pattern)
- (prog1 (match-string 1 pattern)
- (setq helm-recentf--basename-flag t)))
- (t (setq helm-recentf--basename-flag nil)
- pattern))))
-
-(defclass helm-recentf-source (helm-source-sync helm-type-file)
- ((init :initform (lambda ()
- (require 'recentf)
- (recentf-mode 1)))
- (candidates :initform (lambda () recentf-list))
- (pattern-transformer :initform 'helm-recentf-pattern-transformer)
- (match-part :initform (lambda (candidate)
- (if (or helm-ff-transformer-show-only-basename
- helm-recentf--basename-flag)
- (helm-basename candidate) candidate)))
- (migemo :initform t)
- (keymap :initform helm-generic-files-map)
- (help-message :initform helm-generic-file-help-message)))
-
-(defmethod helm--setup-source :after ((source helm-recentf-source))
- (set-slot-value
- source 'action
- (append (symbol-value (helm-actions-from-type-file))
- '(("Delete file(s) from recentf" .
- (lambda (_candidate)
- (cl-loop for file in (helm-marked-candidates)
- do (setq recentf-list (delq file recentf-list)))))))))
-
-(defvar helm-source-recentf nil
- "See (info \"(emacs)File Conveniences\").
-Set `recentf-max-saved-items' to a bigger value if default is too small.")
-
-(defcustom helm-recentf-fuzzy-match nil
- "Enable fuzzy matching in `helm-source-recentf' when non--nil."
- :group 'helm-files
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-recentf
- (helm-make-source "Recentf" 'helm-recentf-source
- :fuzzy-match helm-recentf-fuzzy-match))))
-
-;;; Browse project
-;; Need dependencies:
-;; <https://github.com/emacs-helm/helm-ls-git>
-;; <https://github.com/emacs-helm/helm-ls-hg>
-;; Only hg and git are supported for now.
-(defvar helm--browse-project-cache (make-hash-table :test 'equal))
-
-(defun helm-browse-project-get-buffers (root-directory)
- (cl-loop for b in (helm-buffer-list)
- ;; FIXME: Why default-directory is root-directory
- ;; for current-buffer when coming from helm-quit-and-find-file.
- for cd = (with-current-buffer b default-directory)
- for bn = (buffer-file-name (get-buffer b))
- if (or (and bn (file-in-directory-p bn root-directory))
- (and (null bn)
- (file-in-directory-p cd root-directory)))
- collect b))
-
-(defun helm-browse-project-build-buffers-source (directory)
- (helm-make-source "Buffers in project" 'helm-source-buffers
- :header-name (lambda (name)
- (format
- "%s (%s)"
- name (abbreviate-file-name directory)))
- :buffer-list (lambda () (helm-browse-project-get-buffers directory))))
-
-(defun helm-browse-project-find-files (directory &optional refresh)
- (when refresh (remhash directory helm--browse-project-cache))
- (unless (gethash directory helm--browse-project-cache)
- (puthash directory (helm-walk-directory
- directory
- :directories nil :path 'full :skip-subdirs t)
- helm--browse-project-cache))
- (helm :sources `(,(helm-browse-project-build-buffers-source directory)
- ,(helm-build-in-buffer-source "Browse project"
- :data (gethash directory helm--browse-project-cache)
- :header-name (lambda (name)
- (format
- "%s (%s)"
- name (abbreviate-file-name directory)))
- :match-part (lambda (c)
- (if helm-ff-transformer-show-only-basename
- (helm-basename c) c))
- :filter-one-by-one
- (lambda (c)
- (if helm-ff-transformer-show-only-basename
- (cons (propertize (helm-basename c)
- 'face 'helm-ff-file)
- c)
- (propertize c 'face 'helm-ff-file)))
- :keymap helm-generic-files-map
- :action 'helm-type-file-actions))
- :buffer "*helm browse project*"))
-
-;;;###autoload
-(defun 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>
-and
-<http://melpa.org/#/helm-ls-svn>."
- (interactive "P")
- (cond ((and (require 'helm-ls-git nil t)
- (fboundp 'helm-ls-git-root-dir)
- (helm-ls-git-root-dir))
- (helm-ls-git-ls))
- ((and (require 'helm-ls-hg nil t)
- (fboundp 'helm-hg-root)
- (helm-hg-root))
- (helm-hg-find-files-in-project))
- ((and (require 'helm-ls-svn nil t)
- (fboundp 'helm-ls-svn-root-dir)
- (helm-ls-svn-root-dir))
- (helm-ls-svn-ls))
- (t (let ((cur-dir (helm-browse-project-get--root-dir
- (helm-current-directory))))
- (if (or arg (gethash cur-dir helm--browse-project-cache))
- (helm-browse-project-find-files cur-dir (equal arg '(16)))
- (helm :sources (helm-browse-project-build-buffers-source cur-dir)
- :buffer "*helm browse project*"))))))
-
-(defun helm-browse-project-get--root-dir (directory)
- (cl-loop with dname = (file-name-as-directory directory)
- while (and dname (not (gethash dname helm--browse-project-cache)))
- if (file-remote-p dname)
- do (setq dname nil) else
- do (setq dname (helm-basedir (substring dname 0 (1- (length dname)))))
- finally return (or dname (file-name-as-directory directory))))
-
-(defun helm-ff-browse-project (_candidate)
- "Browse project in current directory.
-See `helm-browse-project'."
- (with-helm-default-directory helm-ff-default-directory
- (helm-browse-project helm-current-prefix-arg)))
-
-(defun helm-ff-run-browse-project ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-browse-project)))
-
-(defun helm-ff-gid (_candidate)
- (with-helm-default-directory helm-ff-default-directory
- (helm-gid)))
-
-(defun helm-ff-run-gid ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-gid)))
-
-;;; session.el files
-;;
-;; session (http://emacs-session.sourceforge.net/) is an alternative to
-;; recentf that saves recent file history and much more.
-(defvar session-file-alist)
-(defvar helm-source-session
- (helm-build-sync-source "Session"
- :candidates (lambda ()
- (cl-delete-if-not (lambda (f)
- (or (string-match helm-tramp-file-name-regexp f)
- (file-exists-p f)))
- (mapcar 'car session-file-alist)))
- :keymap helm-generic-files-map
- :help-message helm-generic-file-help-message
- :action 'helm-type-file-actions)
- "File list from emacs-session.")
-
-\f
-;;; Files in current dir
-;;
-;;
-(defun helm-highlight-files (files)
- "A basic transformer for helm files sources.
-Colorize only symlinks, directories and files."
- (cl-loop for i in files
- for disp = (if (and helm-ff-transformer-show-only-basename
- (not (helm-dir-is-dot i))
- (not (and ffap-url-regexp
- (string-match ffap-url-regexp i)))
- (not (string-match helm-ff-url-regexp i)))
- (helm-basename i) i)
- for type = (and (null helm-ff-tramp-not-fancy)
- (car (file-attributes i)))
- collect
- (cond ((and helm-ff-tramp-not-fancy
- (string-match helm-tramp-file-name-regexp i))
- (cons disp i))
- ((stringp type)
- (cons (propertize disp
- 'face 'helm-ff-symlink
- 'help-echo (expand-file-name i))
- i))
- ((eq type t)
- (cons (propertize disp
- 'face 'helm-ff-directory
- 'help-echo (expand-file-name i))
- i))
- (t (cons (propertize disp
- 'face 'helm-ff-file
- 'help-echo (expand-file-name i))
- i)))))
-
-(defclass helm-files-in-current-dir-source (helm-source-sync helm-type-file)
- ((candidates :initform (lambda ()
- (with-helm-current-buffer
- (let ((dir (helm-current-directory)))
- (when (file-accessible-directory-p dir)
- (directory-files dir t))))))
- (pattern-transformer :initform 'helm-recentf-pattern-transformer)
- (match-part :initform (lambda (candidate)
- (if (or helm-ff-transformer-show-only-basename
- helm-recentf--basename-flag)
- (helm-basename candidate) candidate)))
- (fuzzy-match :initform t)
- (migemo :initform t)
- (keymap :initform helm-generic-files-map)
- (help-message :initform helm-generic-file-help-message)))
-
-(defvar helm-source-files-in-current-dir
- (helm-make-source "Files from Current Directory"
- helm-files-in-current-dir-source))
-
-\f
-;;; External searching file tools.
-;;
-;; Tracker desktop search
-(defvar helm-source-tracker-cand-incomplete nil "Contains incomplete candidate")
-(defun helm-source-tracker-transformer (candidates _source)
- (helm-log "received: %S" candidates)
- (cl-loop for cand in candidates
- for path = (when (stringp helm-source-tracker-cand-incomplete)
- (caar (helm-highlight-files
- (list helm-source-tracker-cand-incomplete))))
- for built = (if (not (stringp cand)) cand
- (let ((snippet cand))
- (unless (or (null path)
- (string= "" path)
- (not (string-match-p
- "\\`[[:space:]]*\\.\\.\\."
- snippet)))
- (let ((complete-candidate
- (cons (concat path "\n" snippet) path)))
- (setq helm-source-tracker-cand-incomplete nil)
- (helm-log "built: %S" complete-candidate)
- complete-candidate))))
- when (and (stringp cand)
- (string-match "\\`[[:space:]]*file://" cand))
- do (setq helm-source-tracker-cand-incomplete ; save path
- (replace-match "" t t cand)) end
- collect built))
-
-(defvar helm-source-tracker-search
- (helm-build-async-source "Tracker Search"
- :candidates-process
- (lambda ()
- (start-process "tracker-search-process" nil
- "tracker-search"
- "--disable-color"
- "--limit=512"
- helm-pattern))
- :filtered-candidate-transformer #'helm-source-tracker-transformer
- ;;(multiline) ; https://github.com/emacs-helm/helm/issues/529
- :keymap helm-generic-files-map
- :action 'helm-type-file-actions
- :action-transformer '(helm-transform-file-load-el
- helm-transform-file-browse-url)
- :requires-pattern 3)
- "Source for retrieving files matching the current input pattern
-with the tracker desktop search.")
-
-;; Spotlight (MacOS X desktop search)
-(defclass helm-mac-spotlight-source (helm-source-async helm-type-file)
- ((candidates-process :initform
- (lambda ()
- (start-process
- "mdfind-process" nil "mdfind" helm-pattern)))
- (requires-pattern :initform 3)))
-
-(defvar helm-source-mac-spotlight
- (helm-make-source "mdfind" helm-mac-spotlight-source)
- "Source for retrieving files via Spotlight's command line
-utility mdfind.")
-
-\f
-;;; Findutils
-;;
-;;
-(defvar helm-source-findutils
- (helm-build-async-source "Find"
- :header-name (lambda (name)
- (concat name " in [" (helm-default-directory) "]"))
- :candidates-process 'helm-find-shell-command-fn
- :filtered-candidate-transformer 'helm-findutils-transformer
- :action-transformer 'helm-transform-file-load-el
- :persistent-action 'helm-ff-kill-or-find-buffer-fname
- :action 'helm-type-file-actions
- :keymap helm-generic-files-map
- :candidate-number-limit 9999
- :requires-pattern 3))
-
-(defun helm-findutils-transformer (candidates _source)
- (let (non-essential
- (default-directory (helm-default-directory)))
- (cl-loop for i in candidates
- for abs = (expand-file-name
- (helm-aif (file-remote-p default-directory)
- (concat it i) i))
- for type = (car (file-attributes abs))
- for disp = (if (and helm-ff-transformer-show-only-basename
- (not (string-match "[.]\\{1,2\\}$" i)))
- (helm-basename abs) abs)
- collect (cond ((eq t type)
- (cons (propertize disp 'face 'helm-ff-directory)
- abs))
- ((stringp type)
- (cons (propertize disp 'face 'helm-ff-symlink)
- abs))
- (t (cons (propertize disp 'face 'helm-ff-file)
- abs))))))
-
-(defun helm-find--build-cmd-line ()
- (require 'find-cmd)
- (let* ((default-directory (or (file-remote-p default-directory 'localname)
- default-directory))
- (patterns+options (split-string helm-pattern "\\(\\`\\| +\\)\\* +"))
- (fold-case (helm-set-case-fold-search (car patterns+options)))
- (patterns (split-string (car patterns+options)))
- (additional-options (and (cdr patterns+options)
- (list (concat (cadr patterns+options) " "))))
- (ignored-dirs ())
- (ignored-files (when helm-findutils-skip-boring-files
- (cl-loop for f in completion-ignored-extensions
- if (string-match "/$" f)
- do (push (replace-match "" nil t f)
- ignored-dirs)
- else collect (concat "*" f))))
- (path-or-name (if helm-findutils-search-full-path
- '(ipath path) '(iname name)))
- (name-or-iname (if fold-case
- (car path-or-name) (cadr path-or-name))))
- (find-cmd (and ignored-dirs
- `(prune (name ,@ignored-dirs)))
- (and ignored-files
- `(not (name ,@ignored-files)))
- `(and ,@(mapcar
- (lambda (pattern)
- `(,name-or-iname ,(concat "*" pattern "*")))
- patterns)
- ,@additional-options))))
-
-(defun helm-find-shell-command-fn ()
- "Asynchronously fetch candidates for `helm-find'.
-Additional find options can be specified after a \"*\"
-separator."
- (let* (process-connection-type
- non-essential
- (cmd (helm-find--build-cmd-line))
- (proc (start-file-process-shell-command "hfind" helm-buffer cmd)))
- (helm-log "Find command:\n%s" cmd)
- (prog1 proc
- (set-process-sentinel
- proc
- (lambda (process event)
- (helm-process-deferred-sentinel-hook
- process event (helm-default-directory))
- (if (string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format "[Find process finished - (%s results)]"
- (max (1- (count-lines
- (point-min) (point-max)))
- 0))
- 'face 'helm-locate-finish))))
- (force-mode-line-update))
- (helm-log "Error: Find %s"
- (replace-regexp-in-string "\n" "" event))))))))
-
-(defun helm-find-1 (dir)
- (let ((default-directory (file-name-as-directory dir)))
- (helm :sources 'helm-source-findutils
- :buffer "*helm find*"
- :ff-transformer-show-only-basename nil
- :case-fold-search helm-file-name-case-fold-search)))
-
-;; helm-find-files integration.
-(defun helm-ff-find-sh-command (_candidate)
- "Run `helm-find' from `helm-find-files'."
- (helm-find-1 helm-ff-default-directory))
-
-(defun helm-ff-run-find-sh-command ()
- "Run find shell command action with key from `helm-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-find-sh-command)))
-
-\f
-;;; Preconfigured commands
-;;
-;;
-;;;###autoload
-(defun helm-find (arg)
- "Preconfigured `helm' for the find shell command."
- (interactive "P")
- (let ((directory
- (if arg
- (file-name-as-directory
- (read-directory-name "DefaultDirectory: "))
- default-directory)))
- (helm-find-1 directory)))
-
-(defvar org-directory)
-;;;###autoload
-(defun 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."
- (interactive "P")
- (let* ((hist (and arg helm-ff-history (helm-find-files-history)))
- (default-input (or hist (helm-find-files-initial-input)))
- (input (cond ((and (eq major-mode 'org-agenda-mode)
- org-directory
- (not default-input))
- (expand-file-name org-directory))
- ((and (eq major-mode 'dired-mode) default-input)
- (file-name-directory default-input))
- ((and (not (string= default-input ""))
- default-input))
- (t (expand-file-name (helm-current-directory)))))
- (input-as-presel (null (nth 0 (file-attributes input))))
- (presel (helm-aif (or hist
- (and input-as-presel input)
- (buffer-file-name (current-buffer))
- (and (eq major-mode 'dired-mode)
- default-input))
- (if helm-ff-transformer-show-only-basename
- (helm-basename it) it))))
- (set-text-properties 0 (length input) nil input)
- (helm-find-files-1 input (and presel (concat "^" (regexp-quote presel))))))
-
-;;;###autoload
-(defun helm-for-files ()
- "Preconfigured `helm' for opening files.
-Run all sources defined in `helm-for-files-preferred-list'."
- (interactive)
- (unless helm-source-buffers-list
- (setq helm-source-buffers-list
- (helm-make-source "Buffers" 'helm-source-buffers)))
- (helm :sources helm-for-files-preferred-list
- :ff-transformer-show-only-basename nil
- :buffer "*helm for files*"))
-
-;;;###autoload
-(defun helm-multi-files ()
- "Preconfigured helm similar to `helm-for-files' but that don't run locate.
-Allow toggling from locate to others sources.
-This allow seeing first if what you search is in other sources before launching
-locate."
- (interactive)
- (unless helm-source-buffers-list
- (setq helm-source-buffers-list
- (helm-make-source "Buffers" 'helm-source-buffers)))
- (setq helm-multi-files--toggle-locate nil)
- (let ((sources (remove 'helm-source-locate helm-for-files-preferred-list))
- (old-key (lookup-key
- helm-map
- (read-kbd-macro helm-multi-files-toggle-locate-binding))))
- (with-helm-temp-hook 'helm-after-initialize-hook
- (define-key helm-map (kbd helm-multi-files-toggle-locate-binding)
- 'helm-multi-files-toggle-to-locate))
- (unwind-protect
- (helm :sources sources
- :ff-transformer-show-only-basename nil
- :buffer "*helm multi files*")
- (define-key helm-map (kbd helm-multi-files-toggle-locate-binding)
- old-key))))
-
-;;;###autoload
-(defun helm-recentf ()
- "Preconfigured `helm' for `recentf'."
- (interactive)
- (helm :sources 'helm-source-recentf
- :ff-transformer-show-only-basename nil
- :buffer "*helm recentf*"))
-
-(provide 'helm-files)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-files.el ends here
+++ /dev/null
-;;; helm-font --- Font and ucs selection for Helm -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-
-(defvar helm-ucs-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "<C-backspace>") 'helm-ucs-persistent-delete)
- (define-key map (kbd "<C-left>") 'helm-ucs-persistent-backward)
- (define-key map (kbd "<C-right>") 'helm-ucs-persistent-forward)
- (define-key map (kbd "<C-return>") 'helm-ucs-persistent-insert)
- map)
- "Keymap for `helm-ucs'.")
-
-
-;;; Xfont selection
-;;
-;;
-(defvar helm-xfonts-cache nil)
-(defvar helm-previous-font nil)
-(defvar helm-source-xfonts
- (helm-build-sync-source "X Fonts"
- :init (lambda ()
- (unless helm-xfonts-cache
- (setq helm-xfonts-cache
- (x-list-fonts "*")))
- ;; Save current font so it can be restored in cleanup
- (setq helm-previous-font (cdr (assoc 'font (frame-parameters)))))
- :candidates 'helm-xfonts-cache
- :action '(("Copy font to kill ring" . (lambda (elm)
- (kill-new elm)))
- ("Set font" . (lambda (elm)
- (kill-new elm)
- (set-frame-font elm 'keep-size)
- (message "Font copied to kill ring"))))
- :cleanup (lambda ()
- ;; Restore previous font
- (set-frame-font helm-previous-font 'keep-size))
- :persistent-action (lambda (new-font)
- (set-frame-font new-font 'keep-size)
- (kill-new new-font))
- :persistent-help "Preview font and copy to kill-ring"))
-
-;;; 𝕌𝕔𝕤 𝕊𝕪𝕞𝕓𝕠𝕝 𝕔𝕠𝕞𝕡𝕝𝕖𝕥𝕚𝕠𝕟
-;;
-;;
-(defvar helm-ucs--max-len 0)
-(defvar helm-ucs--names nil)
-(defun helm-calculate-ucs-max-len ()
- "Calculate the length of longest `ucs-names' candidate."
- (cl-loop with count = 0
- for (n . v) in (ucs-names)
- for len = (length n)
- if (> len count)
- do (setq count len)
- finally return count))
-
-(defun helm-ucs-init ()
- "Initialize an helm buffer with ucs symbols.
-Only math* symbols are collected."
- (unless (> helm-ucs--max-len 0)
- (setq helm-ucs--max-len
- (helm-calculate-ucs-max-len)))
- (or helm-ucs--names
- (setq helm-ucs--names
- (cl-loop for (n . v) in (ucs-names)
- for len = (length n)
- for diff = (+ (- helm-ucs--max-len len) 2)
- unless (string= "" n)
- collect (format "%s:%s%c #x%x"
- n (make-string diff ? ) v v)))))
-
-(defun helm-ucs-forward-char (_candidate)
- (with-helm-current-buffer
- (forward-char 1)))
-
-(defun helm-ucs-backward-char (_candidate)
- (with-helm-current-buffer
- (forward-char -1)))
-
-(defun helm-ucs-delete-backward (_candidate)
- (with-helm-current-buffer
- (delete-char -1)))
-
-(defun helm-ucs-insert (candidate n)
- (with-helm-current-buffer
- (string-match "^\\([^:]+\\): +\\(.\\) \\(#x[a-f0-9]+\\)$" candidate)
- (insert (match-string n candidate))))
-
-(defun helm-ucs-insert-name (candidate)
- (helm-ucs-insert candidate 1))
-
-(defun helm-ucs-insert-char (candidate)
- (helm-ucs-insert candidate 2))
-
-(defun helm-ucs-insert-code (candidate)
- (helm-ucs-insert candidate 3))
-
-(defun helm-ucs-persistent-insert ()
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'action-insert 'helm-ucs-insert-char)
- (helm-execute-persistent-action 'action-insert)))
-
-(defun helm-ucs-persistent-forward ()
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'action-forward 'helm-ucs-forward-char)
- (helm-execute-persistent-action 'action-forward)))
-
-(defun helm-ucs-persistent-backward ()
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'action-back 'helm-ucs-backward-char)
- (helm-execute-persistent-action 'action-back)))
-
-(defun helm-ucs-persistent-delete ()
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'action-delete 'helm-ucs-delete-backward)
- (helm-execute-persistent-action 'action-delete)))
-
-(defvar helm-source-ucs
- (helm-build-in-buffer-source "Ucs names"
- :data #'helm-ucs-init
- :help-message 'helm-ucs-help-message
- :match-part (lambda (candidate) (car (split-string candidate ":")))
- :filtered-candidate-transformer
- (lambda (candidates _source) (sort candidates #'helm-generic-sort-fn))
- :action '(("Insert character" . helm-ucs-insert-char)
- ("Insert character name" . helm-ucs-insert-name)
- ("Insert character code in hex" . helm-ucs-insert-code)
- ("Forward char" . helm-ucs-forward-char)
- ("Backward char" . helm-ucs-backward-char)
- ("Delete char backward" . helm-ucs-delete-backward)))
- "Source for collecting `ucs-names' math symbols.")
-
-;;;###autoload
-(defun helm-select-xfont ()
- "Preconfigured `helm' to select Xfont."
- (interactive)
- (helm :sources 'helm-source-xfonts
- :buffer "*helm select xfont*"))
-
-;;;###autoload
-(defun helm-ucs ()
- "Preconfigured helm for `ucs-names' math symbols."
- (interactive)
- (helm :sources 'helm-source-ucs
- :keymap helm-ucs-map))
-
-(provide 'helm-font)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-font.el ends here
+++ /dev/null
-;;; helm-grep.el --- Helm Incremental Grep. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-regexp)
-
-;;; load wgrep proxy if it's available
-(require 'wgrep-helm nil t)
-
-(declare-function helm-buffer-list "helm-buffers")
-(declare-function helm-elscreen-find-file "helm-elscreen" (file))
-(declare-function View-quit "view")
-(declare-function doc-view-goto-page "doc-view" (page))
-(declare-function helm-mm-split-pattern "helm-multi-match")
-(declare-function helm--ansi-color-apply "helm-lib")
-(defvar helm--ansi-color-regexp)
-
-\f
-(defgroup helm-grep nil
- "Grep related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-grep-default-command
- "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 ,
-here a default command example for ack-grep:
-
-\(setq helm-grep-default-command \"ack-grep -Hn --smart-case --no-group %e %p %f\"
- helm-grep-default-recurse-command \"ack-grep -H --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).
-
-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
-independents, 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 handle badly
- repeated remote processes in a short delay (< to 5s)."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-default-recurse-command
- "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."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-default-zgrep-command
- "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."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-pdfgrep-default-command
- "pdfgrep --color always -niH %s %s"
- "Default command for pdfgrep.
-Option \"--color always\" is supported starting helm version 1.7.8,
-when used matchs will be highlighted according to GREP_COLORS env var."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-use-ioccur-style-keys t
- "Use Arrow keys to jump to occurences."
- :group 'helm-grep
- :type 'boolean)
-
-(defcustom helm-pdfgrep-default-read-command 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 `doc-view-mode' will be used instead of an external command."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-max-length-history 100
- "Max number of elements to save in `helm-grep-history'."
- :group 'helm-grep
- :type 'integer)
-
-(defcustom helm-zgrep-file-extension-regexp
- ".*\\(\\.gz\\|\\.bz\\|\\.xz\\|\\.lzma\\)$"
- "Default file extensions zgrep will search in."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-preferred-ext nil
- "This file extension will be preselected for grep."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-save-buffer-name-no-confirm nil
- "when *hgrep* already exists,auto append suffix."
- :group 'helm-grep
- :type 'boolean)
-
-(defcustom helm-grep-ignored-files
- (cons ".#*" (delq nil (mapcar (lambda (s)
- (unless (string-match-p "/\\'" s)
- (concat "*" s)))
- completion-ignored-extensions)))
- "List of file names which `helm-grep' shall exclude."
- :group 'helm-grep
- :type '(repeat string))
-
-(defcustom helm-grep-ignored-directories
- helm-walk-ignore-directories
- "List of names of sub-directories which `helm-grep' shall not recurse into."
- :group 'helm-grep
- :type '(repeat string))
-
-(defcustom helm-grep-truncate-lines t
- "When nil the grep line that appears will not be truncated."
- :group 'helm-grep
- :type 'boolean)
-
-(defcustom helm-grep-file-path-style '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."
- :group 'helm-grep
- :type '(choice (const :tag "Basename" basename)
- (const :tag "Absolute" absolute)
- (const :tag "Relative" relative)))
-
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-grep-faces nil
- "Customize the appearance of helm-grep."
- :prefix "helm-"
- :group 'helm-grep
- :group 'helm-faces)
-
-(defface helm-grep-match
- '((((background light)) :foreground "#b00000")
- (((background dark)) :foreground "gold1"))
- "Face used to highlight grep matches."
- :group 'helm-grep-faces)
-
-(defface helm-grep-file
- '((t (:foreground "BlueViolet"
- :underline t)))
- "Face used to highlight grep results filenames."
- :group 'helm-grep-faces)
-
-(defface helm-grep-lineno
- '((t (:foreground "Darkorange1")))
- "Face used to highlight grep number lines."
- :group 'helm-grep-faces)
-
-(defface helm-grep-finish
- '((t (:foreground "Green")))
- "Face used in mode line when grep is finish."
- :group 'helm-grep-faces)
-
-(defface helm-grep-cmd-line
- '((t (:inherit diff-added)))
- "Face used to highlight grep command line when no results."
- :group 'helm-grep-faces)
-
-\f
-;;; Keymaps
-;;
-;;
-(defvar helm-grep-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-goto-next-file)
- (define-key map (kbd "M-<up>") 'helm-goto-precedent-file)
- (define-key map (kbd "C-c o") 'helm-grep-run-other-window-action)
- (define-key map (kbd "C-c C-o") 'helm-grep-run-other-frame-action)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- (define-key map (kbd "C-x C-s") 'helm-grep-run-save-buffer)
- (when helm-grep-use-ioccur-style-keys
- (define-key map (kbd "<right>") 'helm-execute-persistent-action)
- (define-key map (kbd "<left>") 'helm-grep-run-default-action))
- (delq nil map))
- "Keymap used in Grep sources.")
-
-(defvar helm-pdfgrep-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-goto-next-file)
- (define-key map (kbd "M-<up>") 'helm-goto-precedent-file)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- map)
- "Keymap used in pdfgrep.")
-
-(defvar helm-grep-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "RET") 'helm-grep-mode-jump)
- (define-key map (kbd "C-o") 'helm-grep-mode-jump-other-window)
- (define-key map (kbd "<C-down>") 'helm-grep-mode-jump-other-window-forward)
- (define-key map (kbd "<C-up>") 'helm-grep-mode-jump-other-window-backward)
- (define-key map (kbd "<M-down>") 'helm-gm-next-file)
- (define-key map (kbd "<M-up>") 'helm-gm-precedent-file)
- (define-key map (kbd "M-n") 'helm-grep-mode-jump-other-window-forward)
- (define-key map (kbd "M-p") 'helm-grep-mode-jump-other-window-backward)
- (define-key map (kbd "M-N") 'helm-gm-next-file)
- (define-key map (kbd "M-P") 'helm-gm-precedent-file)
- map))
-
-\f
-;;; Internals vars
-;;
-;;
-(defvar helm-rzgrep-cache (make-hash-table :test 'equal))
-(defvar helm-grep-default-function 'helm-grep-init)
-(defvar helm-zgrep-recurse-flag nil)
-(defvar helm-grep-history nil)
-(defvar helm-grep-last-targets nil)
-(defvar helm-grep-include-files nil)
-(defvar helm-grep-in-recurse nil)
-(defvar helm-grep-use-zgrep nil)
-(defvar helm-grep-default-directory-fn nil
- "A function that should return a directory to expand candidate to.
-It is intended to use as a let-bound variable, DON'T set this globaly.")
-(defvar helm-pdfgrep-targets nil)
-(defvar helm-grep-last-cmd-line nil)
-(defvar helm-grep-split-line-regexp "^\\([[:lower:][:upper:]]?:?.*?\\):\\([0-9]+\\):\\(.*\\)")
-
-\f
-;;; Init
-;;
-;;
-(defun helm-grep-prepare-candidates (candidates in-directory)
- "Prepare filenames and directories CANDIDATES for grep command line."
- ;; If one or more candidate is a directory, search in all files
- ;; of this candidate (e.g /home/user/directory/*).
- ;; If r option is enabled search also in subdidrectories.
- ;; We need here to expand wildcards to support crap windows filenames
- ;; as grep doesn't accept quoted wildcards (e.g "dir/*.el").
- (if helm-zgrep-recurse-flag
- (mapconcat 'shell-quote-argument candidates " ")
- ;; When candidate is a directory, search in all its files.
- ;; NOTE that `file-expand-wildcards' will return also
- ;; directories, they will be ignored by grep but not
- ;; by ack-grep that will grep all files of this directory
- ;; without recursing in their subdirs though, see that as a one
- ;; level recursion with ack-grep.
- ;; So I leave it as it is, considering it is a feature. [1]
- (cl-loop for i in candidates append
- (cond ((string-match "^git" helm-grep-default-command)
- (list i))
- ;; Candidate is a directory and we use recursion or ack.
- ((and (file-directory-p i)
- (or helm-grep-in-recurse
- ;; ack-grep accept directory [1].
- (helm-grep-use-ack-p)))
- (list (expand-file-name i)))
- ;; Grep doesn't support directory only when not in recurse.
- ((file-directory-p i)
- (file-expand-wildcards
- (concat (file-name-as-directory (expand-file-name i)) "*") t))
- ;; Candidate is a file or wildcard and we use recursion, use the
- ;; current directory instead of candidate.
- ((and (or (file-exists-p i) (string-match "[*]" i))
- helm-grep-in-recurse)
- (list (expand-file-name
- (directory-file-name ; Needed for windoze.
- (file-name-directory (directory-file-name i))))))
- ;; Else should be one or more file/directory
- ;; possibly marked.
- ;; When real is a normal filename without wildcard
- ;; file-expand-wildcards returns a list of one file.
- ;; wildcards should have been already handled by
- ;; helm-read-file-name or helm-find-files but do it from
- ;; here too in case we are called from elsewhere.
- (t (file-expand-wildcards i t))) into all-files ; [1]
- finally return
- (let ((files (if (file-remote-p in-directory)
- ;; Grep don't understand tramp filenames
- ;; use the local name.
- (mapcar (lambda (x)
- (file-remote-p x 'localname))
- all-files)
- all-files)))
- (if (string-match "^git" helm-grep-default-command)
- (mapconcat 'identity files " ")
- (mapconcat 'shell-quote-argument files " "))))))
-
-(defun helm-grep-command (&optional recursive)
- (let* ((com (if recursive
- helm-grep-default-recurse-command
- helm-grep-default-command))
- (exe (and com (car (split-string com " ")))))
- (if (and exe (string= exe "git")) "git-grep" exe)))
-
-(cl-defun helm-grep-use-ack-p (&key where)
- (let* ((rec-com (helm-grep-command t))
- (norm-com (helm-grep-command))
- (norm-com-ack-p (string-match "\\`ack" norm-com))
- (rec-com-ack-p (and rec-com (string-match "\\`ack" rec-com))))
- (cl-case where
- (default (and norm-com norm-com-ack-p))
- (recursive (and rec-com rec-com-ack-p))
- (strict (and norm-com rec-com rec-com-ack-p norm-com-ack-p))
- (t (and (not (and norm-com (string= norm-com "git-grep")))
- (or (and norm-com norm-com-ack-p)
- (and rec-com rec-com-ack-p)))))))
-
-(defun helm-grep--prepare-cmd-line (only-files &optional include zgrep)
- (let* ((default-directory (or (helm-default-directory)
- (expand-file-name helm-ff-default-directory)))
- (fnargs (helm-grep-prepare-candidates
- only-files default-directory))
- (ignored-files (unless (helm-grep-use-ack-p)
- (mapconcat
- (lambda (x)
- (concat "--exclude="
- (shell-quote-argument x)))
- helm-grep-ignored-files " ")))
- (ignored-dirs (unless (helm-grep-use-ack-p)
- (mapconcat
- ;; Need grep version >=2.5.4
- ;; of Gnuwin32 on windoze.
- (lambda (x)
- (concat "--exclude-dir="
- (shell-quote-argument x)))
- helm-grep-ignored-directories " ")))
- (exclude (unless (helm-grep-use-ack-p)
- (if helm-grep-in-recurse
- (concat (or include ignored-files)
- " " ignored-dirs)
- ignored-files)))
- (types (and (helm-grep-use-ack-p)
- ;; When %e format spec is not specified
- ;; in `helm-grep-default-command'
- ;; we need to pass an empty string
- ;; to types to avoid error.
- (or include "")))
- (smartcase (if (helm-grep-use-ack-p) ""
- (unless (let ((case-fold-search nil))
- (string-match-p
- "[[:upper:]]" helm-pattern)) "i"))))
- (format-spec
- helm-grep-default-command
- (delq nil
- (list (unless zgrep
- (if types
- (cons ?e types)
- (cons ?e exclude)))
- (cons ?c (or smartcase ""))
- (cons ?p (shell-quote-argument helm-pattern))
- (cons ?f fnargs))))))
-
-(defun helm-grep-init (cmd-line)
- "Start an asynchronous grep process with CMD-LINE using ZGREP if non--nil."
- (let* ((default-directory (or helm-ff-default-directory
- (helm-default-directory)))
- (zgrep (string-match "\\`zgrep" cmd-line))
- ;; Use pipe only with grep, zgrep or git-grep.
- (process-connection-type (and (not zgrep) (helm-grep-use-ack-p)))
- (tramp-verbose helm-tramp-verbose)
- non-essential)
- ;; Start grep process.
- (helm-log "Starting Grep process in directory `%s'" default-directory)
- (helm-log "Command line used was:\n\n%s"
- (concat ">>> " (propertize cmd-line 'face 'helm-grep-cmd-line) "\n\n"))
- (prog1 ; This function should return the process first.
- (start-file-process-shell-command
- "grep" helm-buffer cmd-line)
- ;; Init sentinel.
- (set-process-sentinel
- (get-buffer-process helm-buffer)
- (lambda (process event)
- (let* ((err (process-exit-status process))
- (noresult (= err 1)))
- (unless err
- (helm-process-deferred-sentinel-hook
- process event (helm-default-directory)))
- (cond ((and noresult
- ;; [FIXME] This is a workaround for zgrep
- ;; that exit with code 1
- ;; after a certain amount of results.
- (not (with-helm-buffer helm-grep-use-zgrep)))
- (with-helm-buffer
- (insert (concat "* Exit with code 1, no result found,"
- " Command line was:\n\n "
- (propertize helm-grep-last-cmd-line
- 'face 'helm-grep-cmd-line)))
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format
- "[%s process finished - (no results)] "
- (if helm-grep-use-zgrep
- "Zgrep"
- (capitalize
- (if helm-grep-in-recurse
- (helm-grep-command t)
- (helm-grep-command)))))
- 'face 'helm-grep-finish))))))
- ((string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format
- "[%s process finished - (%s results)] "
- (if helm-grep-use-zgrep
- "Zgrep"
- (capitalize
- (if helm-grep-in-recurse
- (helm-grep-command t)
- (helm-grep-command))))
- (max (1- (count-lines
- (point-min)
- (point-max)))
- 0))
- 'face 'helm-grep-finish))))
- (force-mode-line-update)))
- ;; Catch error output in log.
- (t (helm-log
- "Error: %s %s"
- (if helm-grep-use-zgrep "Zgrep" "Grep")
- (replace-regexp-in-string "\n" "" event))))))))))
-
-(defun helm-grep-collect-candidates ()
- (let ((cmd-line (helm-grep--prepare-cmd-line
- helm-grep-last-targets
- helm-grep-include-files
- helm-grep-use-zgrep)))
- (set (make-local-variable 'helm-grep-last-cmd-line) cmd-line)
- (funcall helm-grep-default-function cmd-line)))
-
-\f
-;;; Actions
-;;
-;;
-(defun helm-grep-action (candidate &optional where mark)
- "Define a default action for `helm-do-grep' on CANDIDATE.
-WHERE can be one of other-window, elscreen, other-frame."
- (let* ((split (helm-grep-split-line candidate))
- (lineno (string-to-number (nth 1 split)))
- (loc-fname (or (with-current-buffer
- (if (eq major-mode 'helm-grep-mode)
- (current-buffer)
- helm-buffer)
- (get-text-property (point-at-bol) 'help-echo))
- (car split)))
- (tramp-method (file-remote-p (or helm-ff-default-directory
- default-directory) 'method))
- (tramp-host (file-remote-p (or helm-ff-default-directory
- default-directory) 'host))
- (tramp-prefix (concat "/" tramp-method ":" tramp-host ":"))
- (fname (if tramp-host
- (concat tramp-prefix loc-fname) loc-fname)))
- (cl-case where
- (other-window (find-file-other-window fname))
- (elscreen (helm-elscreen-find-file fname))
- (other-frame (find-file-other-frame fname))
- (grep (helm-grep-save-results-1))
- (pdf (if helm-pdfgrep-default-read-command
- (helm-pdfgrep-action-1 split lineno (car split))
- (find-file (car split)) (doc-view-goto-page lineno)))
- (t (find-file fname)))
- (unless (or (eq where 'grep) (eq where 'pdf))
- (helm-goto-line lineno))
- (when mark
- (set-marker (mark-marker) (point))
- (push-mark (point) 'nomsg))
- ;; Save history
- (unless (or helm-in-persistent-action
- (eq major-mode 'helm-grep-mode)
- (string= helm-pattern ""))
- (setq helm-grep-history
- (cons helm-pattern
- (delete helm-pattern helm-grep-history)))
- (when (> (length helm-grep-history)
- helm-grep-max-length-history)
- (setq helm-grep-history
- (delete (car (last helm-grep-history))
- helm-grep-history))))))
-
-(defun helm-grep-persistent-action (candidate)
- "Persistent action for `helm-do-grep'.
-With a prefix arg record CANDIDATE in `mark-ring'."
- (if current-prefix-arg
- (helm-grep-action candidate nil 'mark)
- (helm-grep-action candidate))
- (helm-highlight-current-line))
-
-(defun helm-grep-other-window (candidate)
- "Jump to result in other window from helm grep."
- (helm-grep-action candidate 'other-window))
-
-(defun helm-grep-other-frame (candidate)
- "Jump to result in other frame from helm grep."
- (helm-grep-action candidate 'other-frame))
-
-(defun helm-grep-jump-elscreen (candidate)
- "Jump to result in elscreen from helm grep."
- (helm-grep-action candidate 'elscreen))
-
-(defun helm-goto-next-or-prec-file (n)
- "Go to next or precedent candidate file in helm grep/etags buffers.
-If N is positive go forward otherwise go backward."
- (let* ((allow-mode (or (eq major-mode 'helm-grep-mode)
- (eq major-mode 'helm-moccur-mode)))
- (sel (if allow-mode
- (buffer-substring (point-at-bol) (point-at-eol))
- (helm-get-selection nil t)))
- (current-line-list (helm-grep-split-line sel))
- (current-fname (nth 0 current-line-list))
- (bob-or-eof (if (eq n 1) 'eobp 'bobp))
- (mark-maybe (lambda ()
- (if allow-mode
- (ignore)
- (helm-mark-current-line)))))
- (catch 'break
- (while (not (funcall bob-or-eof))
- (forward-line n) ; Go forward or backward depending of n value.
- ;; Exit when current-fname is not matched or in `helm-grep-mode'
- ;; the line is not a grep line i.e 'fname:num:tag'.
- (setq sel (buffer-substring (point-at-bol) (point-at-eol)))
- (unless (or (string= current-fname
- (car (helm-grep-split-line sel)))
- (and (eq major-mode 'helm-grep-mode)
- (not (get-text-property (point-at-bol) 'help-echo))))
- (funcall mark-maybe)
- (throw 'break nil))))
- (cond ((and (> n 0) (eobp))
- (re-search-backward ".")
- (forward-line 0)
- (funcall mark-maybe))
- ((and (< n 0) (bobp))
- (helm-aif (next-single-property-change (point-at-bol) 'help-echo)
- (goto-char it)
- (forward-line 1))
- (funcall mark-maybe)))
- (helm-log-run-hook 'helm-move-selection-after-hook)))
-
-;;;###autoload
-(defun helm-goto-precedent-file ()
- "Go to precedent file in helm grep/etags buffers."
- (interactive)
- (with-helm-alive-p
- (with-helm-window
- (helm-goto-next-or-prec-file -1))))
-
-;;;###autoload
-(defun helm-goto-next-file ()
- "Go to precedent file in helm grep/etags buffers."
- (interactive)
- (with-helm-window
- (helm-goto-next-or-prec-file 1)))
-
-(defun helm-grep-run-default-action ()
- "Run grep default action from `helm-do-grep-1'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-action)))
-
-(defun helm-grep-run-other-window-action ()
- "Run grep goto other window action from `helm-do-grep-1'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-other-window)))
-
-(defun helm-grep-run-other-frame-action ()
- "Run grep goto other frame action from `helm-do-grep-1'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-other-frame)))
-
-(defun helm-grep-run-save-buffer ()
- "Run grep save results action from `helm-do-grep-1'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-save-results)))
-
-\f
-;;; helm-grep-mode
-;;
-;;
-(defun helm-grep-save-results (candidate)
- (helm-grep-action candidate 'grep))
-
-(defun helm-grep-save-results-1 ()
- "Save helm grep result in a `helm-grep-mode' buffer."
- (let ((buf "*hgrep*")
- new-buf)
- (when (get-buffer buf)
- (if helm-grep-save-buffer-name-no-confirm
- (setq new-buf (format "*hgrep|%s|-%s" helm-pattern
- (format-time-string "%H-%M-%S*")))
- (setq new-buf (helm-read-string "GrepBufferName: " buf))
- (cl-loop for b in (helm-buffer-list)
- when (and (string= new-buf b)
- (not (y-or-n-p
- (format "Buffer `%s' already exists overwrite? "
- new-buf))))
- do (setq new-buf (helm-read-string "GrepBufferName: " "*hgrep "))))
- (setq buf new-buf))
- (with-current-buffer (get-buffer-create buf)
- (setq buffer-read-only t)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert "-*- mode: helm-grep -*-\n\n"
- (format "Grep Results for `%s':\n\n" helm-pattern))
- (save-excursion
- (insert (with-current-buffer helm-buffer
- (goto-char (point-min)) (forward-line 1)
- (buffer-substring (point) (point-max))))))
- (helm-grep-mode) (pop-to-buffer buf))
- (message "Helm Grep Results saved in `%s' buffer" buf)))
-
-;;;###autoload
-(define-derived-mode helm-grep-mode
- special-mode "helm-grep"
- "Major mode to provide actions in helm grep saved buffer.
-
-Special commands:
-\\{helm-grep-mode-map}"
- (set (make-local-variable 'helm-grep-last-cmd-line)
- (with-helm-buffer helm-grep-last-cmd-line))
- (set (make-local-variable 'revert-buffer-function)
- #'helm-grep-mode--revert-buffer-function))
-
-(defun helm-grep-mode--revert-buffer-function (&optional _ignore-auto _noconfirm)
- (goto-char (point-min))
- (re-search-forward "^Grep Results for" nil t)
- (forward-line 0)
- (when (re-search-forward "^$" nil t)
- (forward-line 1))
- (let ((inhibit-read-only t))
- (delete-region (point) (point-max)))
- (message "Reverting buffer...")
- (set-process-sentinel
- (start-file-process-shell-command
- "hgrep" (generate-new-buffer "*hgrep revert*") helm-grep-last-cmd-line)
- (lambda (process event)
- (when (string= event "finished\n")
- (with-current-buffer (current-buffer)
- (let ((inhibit-read-only t))
- (save-excursion
- (cl-loop for line in (with-current-buffer (process-buffer process)
- (prog1 (split-string (buffer-string) "\n")
- (kill-buffer)))
- when (string-match helm-grep-split-line-regexp line)
- do (insert (propertize
- (car (helm-grep-filter-one-by-one line))
- ;; needed for wgrep.
- 'helm-realvalue line)
- "\n"))))
- (message "Reverting buffer done"))))))
-
-(defun helm-gm-next-file ()
- (interactive)
- (helm-goto-next-or-prec-file 1))
-
-(defun helm-gm-precedent-file ()
- (interactive)
- (helm-goto-next-or-prec-file -1))
-
-(defun helm-grep-mode-jump ()
- (interactive)
- (helm-grep-action
- (buffer-substring (point-at-bol) (point-at-eol))))
-
-(defun helm-grep-mode-jump-other-window-1 (arg)
- (let ((candidate (buffer-substring (point-at-bol) (point-at-eol))))
- (condition-case nil
- (progn
- (save-selected-window
- (helm-grep-action candidate 'other-window)
- (recenter))
- (forward-line arg))
- (error nil))))
-
-(defun helm-grep-mode-jump-other-window-forward ()
- (interactive)
- (helm-grep-mode-jump-other-window-1 1))
-
-(defun helm-grep-mode-jump-other-window-backward ()
- (interactive)
- (helm-grep-mode-jump-other-window-1 -1))
-
-(defun helm-grep-mode-jump-other-window ()
- (interactive)
- (let ((candidate (buffer-substring (point-at-bol) (point-at-eol))))
- (condition-case nil
- (helm-grep-action candidate 'other-window)
- (error nil))))
-
-\f
-;;; ack-grep types
-;;
-;;
-(defun helm-grep-hack-types ()
- "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.
- ;; `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
- ;; `helm-grep-use-ack-p'.
- (call-process (helm-grep-command t) nil t nil "--help-types")
- (goto-char (point-min))
- (cl-loop while (re-search-forward
- "^ *--\\(\\[no\\]\\)\\([^. ]+\\) *\\(.*\\)" nil t)
- collect (cons (concat (match-string 2)
- " [" (match-string 3) "]")
- (match-string 2))
- collect (cons (concat "no" (match-string 2)
- " [" (match-string 3) "]")
- (concat "no" (match-string 2))))))
-
-(defun helm-grep-ack-types-transformer (candidates _source)
- (cl-loop for i in candidates
- if (stringp i)
- collect (rassoc i helm-grep-ack-types-cache)
- else
- collect i))
-
-(defvar helm-grep-ack-types-cache nil)
-(defun helm-grep-read-ack-type ()
- "Select types for the '--type' argument of ack-grep."
- (require 'helm-mode)
- (require 'helm-adaptive)
- (setq helm-grep-ack-types-cache (helm-grep-hack-types))
- (let ((types (helm-comp-read
- "Types: " helm-grep-ack-types-cache
- :name "*Ack-grep types*"
- :marked-candidates t
- :must-match t
- :fc-transformer '(helm-adaptive-sort
- helm-grep-ack-types-transformer)
- :buffer "*helm ack-types*")))
- (mapconcat (lambda (type) (concat "--type=" type)) types " ")))
-
-\f
-;;; grep extensions
-;;
-;;
-(defun helm-grep-guess-extensions (files)
- "Try to guess file extensions in FILES list when using grep recurse.
-These extensions will be added to command line with --include arg of grep."
- (cl-loop with ext-list = (list helm-grep-preferred-ext "*")
- with lst = (if (file-directory-p (car files))
- (directory-files
- (car files) nil
- directory-files-no-dot-files-regexp)
- files)
- for i in lst
- for ext = (file-name-extension i 'dot)
- for glob = (and ext (not (string= ext ""))
- (concat "*" ext))
- unless (or (not glob)
- (and glob-list (member glob glob-list))
- (and glob-list (member glob ext-list))
- (and glob-list (member glob helm-grep-ignored-files)))
- collect glob into glob-list
- finally return (delq nil (append ext-list glob-list))))
-
-(defun helm-grep-get-file-extensions (files)
- "Try to return a list of file extensions to pass to '--include' arg of grep."
- (let* ((all-exts (helm-grep-guess-extensions
- (mapcar 'expand-file-name files)))
- (extensions (helm-comp-read "Search Only in: " all-exts
- :marked-candidates t
- :fc-transformer 'helm-adaptive-sort
- :buffer "*helm grep exts*"
- :name "*helm grep extensions*")))
- (when (listp extensions) ; Otherwise it is empty string returned by C-RET.
- ;; If extensions is a list of one string containing spaces,
- ;; assume user entered more than one glob separated by space(s) and
- ;; split this string to pass it later to mapconcat.
- ;; e.g '("*.el *.py")
- (cl-loop for i in extensions
- append (split-string-and-unquote i " ")))))
-
-\f
-;;; Set up source
-;;
-;;
-(defvar helm-source-grep nil)
-(defun helm-do-grep-1 (targets &optional recurse zgrep exts default-input input)
- "Launch grep on a list of TARGETS files.
-When RECURSE is given use -r option of grep and prompt user
-to set the --include args of grep.
-You can give more than one arg separated by space at prompt.
-e.g *.el *.py *.tex.
-From lisp use the EXTS argument as a list of extensions as above.
-If you are using ack-grep, you will be prompted for --type
-instead and EXTS will be ignored.
-If prompt is empty `helm-grep-ignored-files' are added to --exclude.
-Argument DEFAULT-INPUT is use as `default' arg of `helm' and INPUT
-is used as `input' arg of `helm', See `helm' docstring.
-ZGREP when non--nil use zgrep instead, without prompting for a choice
-in recurse, and ignoring EXTS, search being made on
-`helm-zgrep-file-extension-regexp'."
- (when (and (helm-grep-use-ack-p)
- helm-ff-default-directory
- (file-remote-p helm-ff-default-directory))
- (error "Error: Remote operation not supported with ack-grep."))
- (let* (non-essential
- (exts (and recurse
- ;; [FIXME] I could handle this from helm-walk-directory.
- (not zgrep) ; zgrep doesn't handle -r opt.
- (not (helm-grep-use-ack-p :where 'recursive))
- (or exts (helm-grep-get-file-extensions targets))))
- (include-files (and exts
- (mapconcat (lambda (x)
- (concat "--include="
- (shell-quote-argument x)))
- (if (> (length exts) 1)
- (remove "*" exts)
- exts) " ")))
- (types (and (not include-files)
- (not zgrep)
- recurse
- (helm-grep-use-ack-p :where 'recursive)
- ;; When %e format spec is not specified
- ;; ignore types and do not prompt for choice.
- (string-match "%e" helm-grep-default-command)
- (helm-grep-read-ack-type)))
- (follow (and helm-follow-mode-persistent
- (assoc-default 'follow helm-source-grep))))
- ;; When called as action from an other source e.g *-find-files
- ;; we have to kill action buffer.
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- ;; If `helm-find-files' haven't already started,
- ;; give a default value to `helm-ff-default-directory'.
- (unless helm-ff-default-directory
- (setq helm-ff-default-directory default-directory))
- ;; We need to store these vars locally
- ;; to pass infos later to `helm-resume'.
- (helm-set-local-variable 'helm-zgrep-recurse-flag (and recurse zgrep)
- 'helm-grep-last-targets targets
- 'helm-grep-include-files (or include-files types)
- 'helm-grep-in-recurse recurse
- 'helm-grep-use-zgrep zgrep
- 'helm-grep-default-command
- (cond (zgrep helm-default-zgrep-command)
- (recurse helm-grep-default-recurse-command)
- ;; When resuming the local value of
- ;; `helm-grep-default-command' is used, only git-grep
- ;; should need this.
- (t helm-grep-default-command)))
- ;; Setup the source.
- (setq helm-source-grep
- (helm-build-async-source
- (if zgrep "Zgrep" (capitalize (if recurse
- (helm-grep-command t)
- (helm-grep-command))))
- :candidates-process 'helm-grep-collect-candidates
- :filter-one-by-one 'helm-grep-filter-one-by-one
- :keymap helm-grep-map
- :nohighlight t
- :nomark t
- :candidate-number-limit 9999
- :help-message 'helm-grep-help-message
- :history 'helm-grep-history
- :action (helm-make-actions
- "Find File" 'helm-grep-action
- "Find file other frame" 'helm-grep-other-frame
- (lambda () (and (locate-library "elscreen")
- "Find file in Elscreen"))
- 'helm-grep-jump-elscreen
- "Save results in grep buffer" 'helm-grep-save-results
- "Find file other window" 'helm-grep-other-window)
- :persistent-action 'helm-grep-persistent-action
- :persistent-help "Jump to line (`C-u' Record in mark ring)"
- :requires-pattern 2
- :follow follow))
- (helm
- :sources 'helm-source-grep
- :buffer (format "*helm %s*" (if zgrep "zgrep" (helm-grep-command recurse)))
- :default default-input
- :input input
- :keymap helm-grep-map
- :history 'helm-grep-history
- :truncate-lines helm-grep-truncate-lines)))
-
-
-\f
-;;; zgrep
-;;
-;;
-(defun helm-ff-zgrep-1 (flist recursive)
- (unwind-protect
- (let* ((def-dir (or helm-ff-default-directory
- default-directory))
- (only (if recursive
- (or (gethash def-dir helm-rzgrep-cache)
- (puthash
- def-dir
- (helm-walk-directory
- def-dir
- :directories nil
- :path 'full
- :match helm-zgrep-file-extension-regexp)
- helm-rzgrep-cache))
- flist)))
- (helm-do-grep-1 only recursive 'zgrep))
- (setq helm-zgrep-recurse-flag nil)))
-
-\f
-;;; transformers
-;;
-;;
-(defun helm-grep-split-line (line)
- "Split a grep output line."
- ;; The output of grep may send a truncated line in this chunk,
- ;; so don't split until grep line is valid, that is
- ;; once the second part of the line comes with next chunk
- ;; send by process.
- (when (string-match helm-grep-split-line-regexp line)
- ;; Don't use split-string because buffer/file name or string
- ;; may contain a ":".
- (cl-loop for n from 1 to 3 collect (match-string n line))))
-
-(defun helm-grep--filter-candidate-1 (candidate &optional dir)
- (let* ((root (or dir (and helm-grep-default-directory-fn
- (funcall helm-grep-default-directory-fn))))
- (ansi-p (string-match-p helm--ansi-color-regexp candidate))
- (line (if ansi-p (helm--ansi-color-apply candidate) candidate))
- (split (helm-grep-split-line line))
- (fname (if (and root split)
- (expand-file-name (car split) root)
- (car-safe split)))
- (lineno (nth 1 split))
- (str (nth 2 split))
- (display-fname (cl-ecase helm-grep-file-path-style
- (basename (and fname (file-name-nondirectory fname)))
- (absolute fname)
- (relative (and fname root
- (file-relative-name fname root))))))
- (if (and display-fname lineno str)
- (cons (concat (propertize display-fname
- 'face 'helm-grep-file
- 'help-echo fname)
- ":"
- (propertize lineno 'face 'helm-grep-lineno)
- ":"
- (if ansi-p str (helm-grep-highlight-match str)))
- line)
- "")))
-
-(defun helm-grep-filter-one-by-one (candidate)
- "`filter-one-by-one' transformer function for `helm-do-grep'."
- (let ((helm-grep-default-directory-fn
- (or helm-grep-default-directory-fn
- (lambda () (or helm-ff-default-directory
- (helm-default-directory)
- default-directory)))))
- (if (consp candidate)
- ;; Already computed do nothing (default as input).
- candidate
- (and (stringp candidate)
- (helm-grep--filter-candidate-1 candidate)))))
-
-(defun helm-grep-highlight-match (str &optional multi-match)
- "Highlight in string STR all occurences matching `helm-pattern'."
- (let (beg end)
- (condition-case-unless-debug nil
- (with-temp-buffer
- (insert (propertize str 'read-only nil)) ; Fix (#1176)
- (goto-char (point-min))
- (cl-loop for reg in
- (if multi-match
- ;; (m)occur.
- (cl-loop for r in (helm-mm-split-pattern
- helm-pattern)
- unless (string-match "\\`!" r)
- collect
- (helm-aif (and helm-migemo-mode
- (assoc r helm-mm--previous-migemo-info))
- (cdr it) r))
- ;; async sources (grep, gid etc...)
- (list helm-input))
- do
- (while (and (re-search-forward reg nil t)
- (> (- (setq end (match-end 0))
- (setq beg (match-beginning 0))) 0))
- (add-text-properties beg end '(face helm-grep-match)))
- do (goto-char (point-min)))
- (buffer-string))
- (error nil))))
-
-\f
-;;; Grep from buffer list
-;;
-;;
-(defun helm-grep-buffers-1 (candidate &optional zgrep)
- "Run grep on all file--buffers or CANDIDATE if it is a file--buffer.
-If one of selected buffers is not a file--buffer,
-it is ignored and grep will run on all others file--buffers.
-If only one candidate is selected and it is not a file--buffer,
-switch to this buffer and run `helm-occur'.
-If a prefix arg is given run grep on all buffers ignoring non--file-buffers."
- (let* ((prefarg (or current-prefix-arg helm-current-prefix-arg))
- (helm-ff-default-directory
- (if (and helm-ff-default-directory
- (file-remote-p helm-ff-default-directory))
- default-directory
- helm-ff-default-directory))
- (cands (if prefarg
- (buffer-list)
- (helm-marked-candidates)))
- (win-conf (current-window-configuration))
- ;; Non--fname and remote buffers are ignored.
- (bufs (cl-loop for buf in cands
- for fname = (buffer-file-name (get-buffer buf))
- when (and fname (not (file-remote-p fname)))
- collect (expand-file-name fname))))
- (if bufs
- (if zgrep
- (helm-do-grep-1 bufs nil 'zgrep)
- (helm-do-grep-1 bufs))
- ;; bufs is empty, thats mean we have only CANDIDATE
- ;; and it is not a buffer-filename, fallback to occur.
- (switch-to-buffer candidate)
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (helm-occur)
- (when (eq helm-exit-status 1)
- (set-window-configuration win-conf)))))
-
-(defun helm-grep-buffers (candidate)
- "Action to grep buffers."
- (helm-grep-buffers-1 candidate))
-
-(defun helm-zgrep-buffers (candidate)
- "Action to zgrep buffers."
- (helm-grep-buffers-1 candidate 'zgrep))
-
-\f
-;;; Helm interface for pdfgrep
-;; pdfgrep program <http://pdfgrep.sourceforge.net/>
-;; and a pdf-reader (e.g xpdf) are needed.
-;;
-(defvar helm-pdfgrep-default-function 'helm-pdfgrep-init)
-(defun helm-pdfgrep-init (only-files)
- "Start an asynchronous pdfgrep process in ONLY-FILES list."
- (let* ((default-directory (or helm-ff-default-directory
- default-directory))
- (fnargs (helm-grep-prepare-candidates
- (if (file-remote-p default-directory)
- (mapcar (lambda (x)
- (file-remote-p x 'localname))
- only-files)
- only-files)
- default-directory))
- (cmd-line (format helm-pdfgrep-default-command
- helm-pattern
- fnargs))
- process-connection-type)
- ;; Start pdf grep process.
- (helm-log "Starting Pdf Grep process in directory `%s'" default-directory)
- (helm-log "Command line used was:\n\n%s"
- (concat ">>> " (propertize cmd-line 'face 'helm-grep-cmd-line) "\n\n"))
- (prog1
- (start-file-process-shell-command
- "pdfgrep" helm-buffer cmd-line)
- (message nil)
- (set-process-sentinel
- (get-buffer-process helm-buffer)
- (lambda (_process event)
- (if (string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format "[Pdfgrep Process Finish - %s result(s)] "
- (max (1- (count-lines
- (point-min) (point-max))) 0))
- 'face 'helm-grep-finish))))
- (force-mode-line-update))
- (helm-log "Error: Pdf grep %s"
- (replace-regexp-in-string "\n" "" event))))))))
-
-(defun helm-do-pdfgrep-1 (only)
- "Launch pdfgrep with a list of ONLY files."
- (unless (executable-find "pdfgrep")
- (error "Error: No such program `pdfgrep'."))
- (let* (helm-grep-in-recurse) ; recursion is never used in pdfgrep.
- ;; When called as action from an other source e.g *-find-files
- ;; we have to kill action buffer.
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (setq helm-pdfgrep-targets only)
- (helm
- :sources (helm-build-async-source "PdfGrep"
- :init (lambda ()
- ;; If `helm-find-files' haven't already started,
- ;; give a default value to `helm-ff-default-directory'.
- (setq helm-ff-default-directory (or helm-ff-default-directory
- default-directory)))
- :candidates-process (lambda ()
- (funcall helm-pdfgrep-default-function helm-pdfgrep-targets))
- :nohighlight t
- :nomark t
- :filter-one-by-one #'helm-grep-filter-one-by-one
- :candidate-number-limit 9999
- :history 'helm-grep-history
- :keymap helm-pdfgrep-map
- :help-message 'helm-pdfgrep-help-message
- :action #'helm-pdfgrep-action
- :persistent-help "Jump to PDF Page"
- :requires-pattern 2)
- :buffer "*helm pdfgrep*"
- :history 'helm-grep-history)))
-
-(defun helm-pdfgrep-action (candidate)
- (helm-grep-action candidate 'pdf))
-
-(defun helm-pdfgrep-action-1 (_split pageno fname)
- (save-selected-window
- (start-file-process-shell-command
- "pdf-reader" nil
- (format-spec helm-pdfgrep-default-read-command
- (list (cons ?f fname) (cons ?p pageno))))))
-\f
-;;; AG - AT
-;;
-;; https://github.com/ggreer/the_silver_searcher
-;; https://github.com/monochromegane/the_platinum_searcher
-
-(defcustom helm-grep-ag-command
- "ag --line-numbers -S --hidden --color --nogroup %s %s"
- "The default command for AG or PT.
-Takes two format specs, the first for pattern and the second for directory.
-
-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).
-
-You can use safely \"--color\" (default)."
- :group 'helm-grep
- :type 'string)
-
-(defun helm-grep--ag-command ()
- (car (split-string helm-grep-ag-command)))
-
-(defun helm-grep-ag-init (directory)
- (let ((cmd-line (format helm-grep-ag-command
- (shell-quote-argument helm-pattern)
- (shell-quote-argument directory))))
- (set (make-local-variable 'helm-grep-last-cmd-line) cmd-line)
- (prog1
- (start-process-shell-command
- "ag" helm-buffer cmd-line)
- (set-process-sentinel
- (get-buffer-process helm-buffer)
- (lambda (_process event)
- (when (string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format
- "[%s process finished - (%s results)] "
- (upcase (helm-grep--ag-command))
- (max (1- (count-lines
- (point-min)
- (point-max)))
- 0))
- 'face 'helm-grep-finish))))
- (force-mode-line-update))))))))
-
-(defvar helm-source-grep-ag nil)
-(defun helm-grep-ag-1 (directory)
- (setq helm-source-grep-ag
- (helm-build-async-source (upcase (helm-grep--ag-command))
- :header-name (lambda (name)
- (format "%s [%s]"
- name (abbreviate-file-name directory)))
- :candidates-process
- (lambda () (helm-grep-ag-init directory))
- :nohighlight t
- :keymap helm-grep-map
- :help-message 'helm-grep-help-message
- :filter-one-by-one 'helm-grep-filter-one-by-one
- :persistent-action 'helm-grep-persistent-action
- :candidate-number-limit 99999
- :requires-pattern 2
- :nomark t
- :action (helm-make-actions
- "Find File" 'helm-grep-action
- "Find file other frame" 'helm-grep-other-frame
- (lambda () (and (locate-library "elscreen")
- "Find file in Elscreen"))
- 'helm-grep-jump-elscreen
- "Save results in grep buffer" 'helm-grep-save-results
- "Find file other window" 'helm-grep-other-window)))
- (helm :sources 'helm-source-grep-ag
- :keymap helm-grep-map
- :truncate-lines helm-grep-truncate-lines
- :buffer (format "*helm %s*" (helm-grep--ag-command))))
-
-;;; Git grep
-;;
-;;
-(defcustom helm-grep-git-grep-command
- "git grep -n%cH --color=always --exclude-standard --no-index --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.
-You have also to enable this in global \".gitconfig\" with
- \"git config --global core.excludesfile ~/.gitignore_global\"."
- :group 'helm-grep
- :type 'string)
-
-(defun helm-grep-git-1 (directory &optional all)
- (require 'vc)
- (let* ((helm-grep-default-command helm-grep-git-grep-command)
- helm-grep-default-recurse-command
- ;; Expand filename of each candidate with the git root dir.
- ;; The filename will be in the help-echo prop.
- (helm-grep-default-directory-fn (lambda ()
- (vc-find-root directory ".git")))
- (helm-ff-default-directory (funcall helm-grep-default-directory-fn)))
- (cl-assert helm-ff-default-directory nil "Not inside a Git repository")
- (helm-do-grep-1 (if all '("") `(,(expand-file-name directory))))))
-
-\f
-;;;###autoload
-(defun helm-do-grep-ag ()
- "Preconfigured helm for grepping with AG in `default-directory'."
- (interactive)
- (helm-grep-ag-1 default-directory))
-
-;;;###autoload
-(defun helm-grep-do-git-grep (arg)
- "Preconfigured helm for git-grepping `default-directory'.
-With a prefix arg ARG git-grep the whole repository."
- (interactive "P")
- (helm-grep-git-1 default-directory arg))
-
-
-(provide 'helm-grep)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-grep.el ends here
+++ /dev/null
-;;; helm-help.el --- Help messages for Helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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)
-
-(defvar helm-org-headings--nofilename)
-(declare-function helm-source-org-headings-for-files "helm-org.el")
-
-\f
-(defgroup helm-help nil
- "Embedded help for `helm'."
- :group 'helm)
-
-(defface helm-helper
- '((t :inherit helm-header))
- "Face for helm help string in minibuffer."
- :group 'helm-help)
-
-(defcustom helm-documentation-file "~/.emacs.d/helm-doc.org"
- "The file where you want to save helm documentation."
- :group 'helm-help
- :type 'string)
-\f
-(defvar helm-help--string-list '(helm-help-message
- helm-buffer-help-message
- helm-ff-help-message
- helm-read-file-name-help-message
- helm-generic-file-help-message
- helm-grep-help-message
- helm-pdfgrep-help-message
- helm-etags-help-message
- helm-ucs-help-message
- helm-bookmark-help-message
- helm-esh-help-message
- helm-buffers-ido-virtual-help-message
- helm-moccur-help-message
- helm-top-help-message
- helm-apt-help-message
- helm-el-package-help-message
- helm-M-x-help-message
- helm-imenu-help-message
- helm-colors-help-message
- helm-semantic-help-message
- helm-kmacro-help-message))
-
-\f
-;;;###autoload
-(defun helm-documentation (arg)
- "Preconfigured helm for helm documentation.
-With a prefix arg refresh the documentation.
-
-Find here the documentation of all sources actually documented."
- (interactive "P")
- (require 'helm-org)
- (when arg (delete-file helm-documentation-file)
- (helm-aif (get-file-buffer helm-documentation-file)
- (kill-buffer it)))
- (unless (file-exists-p helm-documentation-file)
- (with-temp-file helm-documentation-file
- (erase-buffer)
- (cl-loop for elm in helm-help--string-list
- for str = (symbol-value elm)
- do (insert (substitute-command-keys
- (if (functionp str) (funcall str) str))
- "\n\n"))))
- (let ((helm-org-headings--nofilename t))
- (helm :sources (helm-source-org-headings-for-files
- (list helm-documentation-file))
- :candidate-number-limit 99999
- :buffer "*helm documentation*")))
-\f
-;;; Local help messages.
-
-;;; `helm-buffer-list' help
-;;
-;;
-(defvar helm-buffer-help-message
- "* Helm Buffer
-
-** Tips
-
-*** Completion
-
-**** Major-mode
-
-You can enter a partial name of major-mode (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\" will list all buffers but the ones in lisp-mode, sh-mode and
-fundamental-mode.
-
-Enter then a space and a pattern to narrow down to buffers matching this pattern.
-
-**** Search inside buffers
-
-If you enter a space and a pattern prefixed by \"@\" helm will search for text matching
-this pattern INSIDE the buffer (i.e not in the name of buffer).
-NOTE that if you enter your pattern prefixed with \"@\" but escaped, helm will search a buffer
-matching \"@pattern\" but will not search inside.
-
-**** Search by directory name
-
-If you prefix the beginning of pattern with \"/\" the match will occur on directory name
-of buffer, it is interesting to narrow down to one directory for example, subsequent string
-entered after a space will match on buffer-name only.
-Note that negation is not supported for matching on buffer-file-name.
-You can specify more than one directory starting from helm v1.6.8
-
-**** Fuzzy matching
-
-Note that if `helm-buffers-fuzzy-matching' is non--nil you will have
-fuzzy matching on buffer names (not on directory name matching and major-mode though).
-A pattern starting with \"^\" will disable fuzzy matching and will match by exact regexp.
-
-**** Examples
-
-if I enter in pattern prompt:
-
- \"*lisp ^helm @moc\"
-
-helm will narrow down the list by selecting only buffers that are in lisp mode, start by helm
-and match \"moc\" in their contents.
-
-if I enter in pattern prompt:
-
- \"*lisp ^helm moc\"
-
-Notice there is no \"@\" this time
-helm will look for lisp mode buffers starting by \"helm\" and have \"moc\" in their name.
-
-if I enter in pattern prompt:
-
- \"*!lisp !helm\"
-
-helm will narrow down to buffers that are not in \"lisp\" mode and that do not match \"helm\"
-
-if I enter in pattern prompt:
-
- /helm/ w3
-
-helm will narrow down to buffers that are in any \"helm\" subdirectory and matching w3.
-
-*** Creating buffers
-
-When creating a new buffer use \\[universal-argument] to choose a mode for your buffer in a list.
-This list is customizable, see `helm-buffers-favorite-modes'.
-
-*** Killing buffers
-
-You have a command to kill buffer(s) and quit emacs and a command to kill buffers one by one
-\(no marked\) without quitting helm.
-
-You can run this persistent kill buffer command either with the regular
-`helm-execute-persistent-action' called with a prefix arg (C-u C-j) or with its specific command
-`helm-buffer-run-kill-persistent' see binding below.
-
-*** Meaning of colors and prefixes for buffers
-
-Remote buffers are prefixed with '@'.
-Red => Buffer have its file modified on disk by an external process.
-Indianred2 => Buffer exists but its file have been deleted.
-Orange => Buffer is modified and its file not saved to disk.
-Italic => A non--file buffer.
-
-** Commands
-\\<helm-buffer-map>
-\\[helm-buffer-run-zgrep]\t\tGrep Buffer(s) works as zgrep too (C-u grep all buffers but non--file buffers).
-\\[helm-buffers-run-multi-occur]\t\tMulti Occur buffer or marked buffers. (C-u toggle force searching current-buffer).
-\\[helm-buffer-switch-other-window]\t\tSwitch other window.
-\\[helm-buffer-switch-other-frame]\t\tSwitch other frame.
-\\[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. If two marked buffers ediff those buffers.
-\\[helm-buffer-run-ediff-merge]\t\tEdiff merge current buffer with candidate. If two marked buffers ediff merge those buffers.
-\\[helm-buffer-diff-persistent]\t\tToggle Diff buffer with saved file without quitting.
-\\[helm-buffer-revert-persistent]\t\tRevert buffer without quitting.
-\\[helm-buffer-save-persistent]\t\tSave buffer without quitting.
-\\[helm-buffer-run-kill-buffers]\t\tDelete marked buffers and quit.
-\\[helm-buffer-run-kill-persistent]\t\tDelete buffer without quitting helm.
-\\[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 with same type (color) than current.")
-
-;;; Find files help (`helm-find-files')
-;;
-;;
-(defvar helm-ff-help-message
- "* Helm Find Files
-
-** Tips
-
-*** Navigation summary
-
-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.
-
-**** Use `C-j' (persistent action) on a directory to go down one level
-
-On a symlinked directory a prefix arg will allow expanding to its true name.
-
-**** Use `C-l' on a directory to go up one level
-
-**** Use `C-r' to walk back the resulting tree of all the `C-l' you did
-
-Note: The tree is reinitialized each time you enter a new tree with `C-j'
-or by entering some pattern in prompt.
-
-*** Find file at point
-
-Helm is using `ffap' partially or completely to find file at point
-depending on value of `helm-ff-guess-ffap-filenames'.
-You can use full `ffap' by setting this to non-nil (annoying).
-Default value is nil which make `ffap' working partially.
-
-**** Find file at number line
-
-With something like this at point:
-
- ~/elisp/helm/helm.el:1234
-
-Helm will find this file at line number 1234.
-
-**** Find url at point
-
-When an url is found at point, helm expand to that url only.
-Pressing RET jump to that url using `browse-url-browser-function'.
-
-**** Find mail at point
-
-When a mail address is found at point helm expand to this email address
-prefixed by \"mailto:\". Pressing RET open a message buffer with this mail
-address.
-
-*** Quick pattern expansion
-
-**** Enter `~/' at end of pattern to quickly reach home directory
-
-**** Enter `/' at end of pattern to quickly reach root of your file system
-
-**** Enter `./' at end of pattern to quickly reach `default-directory' (initial start of session)
-
-If you are already in `default-directory' this will move cursor on top.
-
-**** Enter `../' at end of pattern will reach upper directory, moving cursor on top
-
-NOTE: This is different to using `C-l' in that `C-l' don't move cursor on top but stay on previous
-subdir name.
-
-**** Enter any environment var (e.g. `$HOME') at end of pattern, it will be expanded
-
-**** You can yank any valid filename after pattern, it will be expanded
-
-*** Helm find files is fuzzy matching (start on third char entered)
-
-e.g. \"fob\" or \"fbr\" will complete \"foobar\"
-but \"fb\" will wait for a third char for completing.
-
-*** Use `C-u C-j' to watch an image or `C-<down>'
-
-*** `C-j' on a filename will expand in helm-buffer to this filename
-
-Second hit on `C-j' will display buffer filename.
-Third hit on `C-j' will kill buffer filename.
-NOTE: `C-u C-j' will display buffer directly.
-
-*** To browse images directories turn on `helm-follow-mode' and navigate with arrow keys
-
-You can also use `helm-follow-action-forward' and `helm-follow-action-backward'
-\(`C-<down' and `C-<left>').
-
-*** You can turn off/on (toggle) autoupdate completion at any moment with `C-DEL'
-
-It is useful when auto completion is enabled and when trying to create a new file
-or directory you want to prevent helm trying to complete what you are writing.
-NOTE: On a terminal C-<backspace> may not work, use in this case C-c <backspace>.
-
-*** You can create a new directory and a new file at the same time
-
-Just write the path in prompt and press `<RET>'.
-e.g. You can create \"~/new/newnew/newnewnew/my_newfile.txt\".
-
-*** To create a new directory, add a \"/\" at end of new name and press <RET>
-
-*** To create a new file just write the filename not ending with \"/\"
-
-*** Recursive search from helm find files
-
-**** You can use helm browse project (see binding below)
-
-- With no prefix arg
- If your current directory is under version control
- with one of git or hg and you have installed helm-ls-git and/or helm-ls-hg
- https://github.com/emacs-helm/helm-ls-git.git
- https://github.com/emacs-helm/helm-ls-hg
- you will see all your files under version control, otherwise
- you will be back to helm-find-files.
-- With one prefix arg
- You will see all the files under this directory
- and other subdirectories (recursion) and this list of files will be cached.
-- With two prefix args
- same but the cache will be refreshed.
-
-**** You can start a recursive search with Locate of Find (See commands below)
-
-With Locate you can use a local db with a prefix arg. If the localdb doesn't already
-exists, you will be prompted for its creation, if it exists and you want to refresh it,
-give two prefix args.
-
-*** Insert filename at point or complete filename at point
-
-On insertion (no completion, i.e nothing at point):
-
-- `C-c i' => insert absolute file name.
-- `C-u C-c i' => insert abbreviate file name.
-- `C-u C-u C-c i' => insert relative file name.
-
-On completion:
-
-- target starts by ~/ => insert abbreviate file name.
-- target starts by / or [a-z]:/ => insert full path.
-- otherwise => insert relative file name.
-
-*** Using wildcard to select multiple files
-
-Use of wilcard is supported to give a set of files to an action:
-
-e.g. You can copy all the files with \".el\" extension by using \"*.el\"
-and then run your copy action.
-
-You can do the same but with \"**.el\" (note the two stars),
-this will select recursively all \".el\" files under current directory.
-
-NOTE: When using an action that involve an external backend (e.g. grep), using \"**\"
-is not advised (even if it works fine) because it will be slower to select all your files,
-you have better time letting the backend doing it, it will be faster.
-However, if you know you have not many files it is reasonable to use this,
-also using not recursive wilcard (e.g. \"*.el\") is perfectly fine for this.
-
-This feature (\"**\") is activated by default with the option `helm-file-globstar'.
-The directory selection with \"**foo/\" like bash shopt globstar option is not supported yet.
-
-*** Copying renaming asynchronously
-
-If you use async library (if you have installed helm from MELPA you do) you can enable
-async for copying/renaming etc... your files by enabling `dired-async-mode'.
-
-Note that even when async is enabled, running a copy/rename action with a prefix arg
-will execute action synchronously, it will follow also the first file of the marked files
-in its destination directory.
-
-*** Bookmark your `helm-find-files' session
-
-You can bookmark your `helm-find-files' session with `C-x r m'.
-You can retrieve later these bookmarks easily by using M-x helm-filtered-bookmarks
-or from the current `helm-find-files' session just hitting `C-x r b'.
-
-*** Run Gid from `helm-find-files'
-
-You can navigate to a project containing an ID file created with the `mkid'
-command from id-utils, and run the `gid' command which will use the symbol at point
-in `helm-current-buffer' as default.
-
-** Commands
-\\<helm-find-files-map>
-\\[helm-ff-run-locate]\t\tRun Locate (C-u to specify locate db, M-n insert basename of candidate)
-\\[helm-ff-run-browse-project]\t\tBrowse project (`C-u' recurse, `C-u C-u' recurse and refresh db)
-\\[helm-ff-run-find-sh-command]\t\tRun Find shell command from this directory.
-\\[helm-ff-run-grep]\t\tRun Grep (C-u Recursive).
-\\[helm-ff-run-pdfgrep]\t\tRun Pdfgrep on marked files.
-\\[helm-ff-run-zgrep]\t\tRun zgrep (C-u Recursive).
-\\[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 (C-u use thing-at-point `C-u C-u' reload cache)
-\\[helm-ff-run-rename-file]\t\tRename File (C-u Follow).
-\\[helm-ff-run-query-replace-on-marked]\t\tQuery replace on marked files.
-\\[helm-ff-run-copy-file]\t\tCopy File (C-u Follow).
-\\[helm-ff-run-byte-compile-file]\t\tByte Compile File (C-u Load).
-\\[helm-ff-run-load-file]\t\tLoad File.
-\\[helm-ff-run-symlink-file]\t\tSymlink File.
-\\[helm-ff-run-hardlink-file]\t\tHardlink file.
-\\[helm-ff-run-delete-file]\t\tDelete File.
-\\[helm-ff-run-kill-buffer-persistent]\t\tKill buffer candidate without quitting.
-\\[helm-ff-persistent-delete]\t\tDelete file without quitting.
-\\[helm-ff-run-switch-to-eshell]\t\tSwitch to Eshell.
-\\[helm-ff-run-eshell-command-on-file]\t\tEshell command on file (C-u 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 other window.
-\\[helm-ff-run-switch-other-frame]\t\tSwitch other frame.
-\\[helm-ff-run-open-file-externally]\t\tOpen file with external program (C-u to choose).
-\\[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 down precedent directory.
-\\[helm-ff-run-switch-to-history]\t\tSwitch to last visited directories 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 visibles candidates.
-\\[helm-ff-run-toggle-auto-update]\t\tToggle auto expansion of directories.
-\\[helm-unmark-all]\t\tUnmark all candidates, visibles and invisibles.
-\\[helm-ff-run-gnus-attach-files]\t\tGnus attach files to message buffer.
-\\[helm-ff-run-print-file]\t\tPrint file, (C-u to refresh printers 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.")
-
-;;; Help for `helm-read-file-name'
-;;
-;;
-(defvar helm-read-file-name-help-message
- "* Helm read file name
-
-** Tips
-
-If you are here, you are probably using a vanilla command like `find-file'
-helmized by `helm-mode', this is cool, but it is even better for your file
-navigation to use `helm-find-files' which is fully featured.
-
-*** Navigation
-
-**** Enter `~/' at end of pattern to quickly reach home directory
-
-**** Enter `/' at end of pattern to quickly reach root of your file system
-
-**** Enter `./' at end of pattern to quickly reach `default-directory' (initial start of session)
-
-If you are in `default-directory' move cursor on top.
-
-**** Enter `../' at end of pattern will reach upper directory, moving cursor on top
-
-NOTE: This different to using `C-l' in that `C-l' don't move cursor on top but stay on previous
-subdir name.
-
-**** You can complete with partial basename (start on third char entered)
-
-E.g. \"fob\" or \"fbr\" will complete \"foobar\"
-but \"fb\" will wait for a third char for completing.
-
-*** Persistent actions
-
-By default `helm-read-file-name' use the persistent actions of `helm-find-files'
-
-**** Use `C-u C-j' to watch an image
-
-**** `C-j' on a filename will expand in helm-buffer to this filename
-
-Second hit on `C-j' will display buffer filename.
-Third hit on `C-j' will kill buffer filename.
-NOTE: `C-u C-j' will display buffer directly.
-
-**** To browse images directories turn on `helm-follow-mode' and navigate with arrow keys
-
-*** Delete characters backward
-
-When you want to delete backward characters, e.g. to create a new file or directory,
-autoupdate may keep updating to an existent directory preventing you from doing so.
-In this case, type 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 C-<backspace> may not work, use in this case C-c <backspace>.
-
-*** Create new directory and files
-
-**** 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,
-just write the path in prompt and press <RET>.
-E.g. You can create \"~/new/newnew/newnewnew/my_newfile.txt\".
-
-**** To create a new directory, add a \"/\" at end of new name and press <RET>
-
-**** To create a new file just write the filename not ending with \"/\"
-
-_NOTE_: File and directory creation work only in some commands (e.g `find-file')
-and will not work in other commands where it is not intended to return a file or a directory
-\(e.g `list-directory').
-
-** Commands
-\\<helm-read-file-map>
-\\[helm-find-files-up-one-level]\t\tGo down precedent 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\tMaybe return empty string (unless `must-match').
-\\[helm-next-source]\t\tGoto next source.
-\\[helm-previous-source]\t\tGoto previous source.")
-
-;;; Generic file help - Used by locate.
-;;
-;;
-(defvar helm-generic-file-help-message
- "* Helm Generic files
-
-** Tips
-
-*** Locate
-
-You can add after writing search pattern any of the locate command line options.
-e.g. -b, -e, -n <number>...etc.
-See Man locate for more infos.
-
-Some other sources (at the moment recentf and file in current directory sources)
-support the -b flag for compatibility with locate when they are used with it.
-
-*** Browse project
-
-When your directory is not under version control,
-don't forget to refresh your cache when files have been added/removed in your directory.
-
-*** Find command
-
-Recursively search files using \"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 options directly to find after a \"*\" separator.
-For example, this would find all files matching \"book\" that are larger
-than 1 megabyte:
-
- book * -size +1M
-
-** Commands
-\\<helm-generic-files-map>
-\\[helm-ff-run-toggle-basename]\t\tToggle basename.
-\\[helm-ff-run-grep]\t\tRun grep (C-u recurse).
-\\[helm-ff-run-zgrep]\t\tRun zgrep.
-\\[helm-ff-run-gid]\t\tRun gid (id-utils).
-\\[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 file(s) (C-u load) (elisp).
-\\[helm-ff-run-load-file]\t\tLoad file(s) (elisp).
-\\[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 other window.
-\\[helm-ff-properties-persistent]\t\tShow file properties.
-\\[helm-ff-run-etags]\t\tRun etags (C-u use tap, C-u C-u reload DB).
-\\[helm-yank-text-at-point]\t\tYank text at point.
-\\[helm-ff-run-open-file-externally]\t\tOpen file with external program (C-u 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.")
-
-;;; Grep help
-;;
-;;
-(defvar helm-grep-help-message
- "* Helm Grep
-
-** Tips
-
-*** You can start grep with a prefix arg to recurse in subdirectories
-
-*** You can use wild card when selecting files (e.g. *.el)
-
-*** You can grep in many differents directories by marking files or wild cards
-
-*** You can save your results in a `helm-grep-mode' buffer, see commands below
-
-Once in this buffer you can use emacs-wgrep to edit your changes.
-
-*** Important
-
-Grepping on remote file will work only with grep, not ack-grep, but it is
-anyway bad supported as tramp doesn't support multiple process running in a
-short delay (less than 5s actually) among other things,
-so I strongly advice hitting `C-!' (i.e suspend process)
-before entering anything in pattern, and hit again `C-!' when
-your regexp is ready to send to remote process, even if helm is handling
-this by delaying each process at 5s.
-Or even better don't use tramp at all and mount your remote file system on SSHFS.
-
-* Helm Gid
-
-** Tips
-
-Helm gid read 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.
-You have access to this command also from `helm-find-files' which allow you to
-navigate to another directory to consult its database.
-
-* Helm AG
-
-** Tips
-
-Helm AG is different from grep or ack-grep in that it works on a directory and not
-a list of files.
-You can ignore files and directories by using a \".agignore\" file, local to directory
-or global when placed in home directory (See AG man page for more infos).
-This file supports same entries as what you will find in `helm-grep-ignored-files' and
-`helm-grep-ignored-directories'.
-As always you can access helm AG from `helm-find-files'.
-
-** Commands
-\\<helm-grep-map>
-\\[helm-goto-next-file]\t\tNext File.
-\\[helm-goto-precedent-file]\t\tPrecedent File.
-\\[helm-yank-text-at-point]\t\tYank Text at point in minibuffer.
-\\[helm-grep-run-other-window-action]\t\tJump other window.
-\\[helm-grep-run-other-frame-action]\t\tJump 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.")
-
-;;; Pdf grep help
-;;
-;;
-(defvar helm-pdfgrep-help-message
- "* Helm PdfGrep Map
-
-** Commands
-\\<helm-pdfgrep-map>
-\\[helm-goto-next-file]\t\tNext File.
-\\[helm-goto-precedent-file]\t\tPrecedent File.
-\\[helm-yank-text-at-point]\t\tYank Text at point in minibuffer.")
-
-;;; Etags help
-;;
-;;
-(defvar helm-etags-help-message
- "* Helm Etags Map
-
-** Commands
-\\<helm-etags-map>
-\\[helm-goto-next-file]\t\tNext File.
-\\[helm-goto-precedent-file]\t\tPrecedent File.
-\\[helm-yank-text-at-point]\t\tYank Text at point in minibuffer.")
-
-;;; Ucs help
-;;
-;;
-(defvar helm-ucs-help-message
- "* Helm Ucs
-
-** Tips
-
-Use commands below to insert unicode characters
-in current-buffer without quitting helm.
-
-** Commands
-\\<helm-ucs-map>
-\\[helm-ucs-persistent-insert]\t\tInsert char.
-\\[helm-ucs-persistent-forward]\t\tForward char.
-\\[helm-ucs-persistent-backward]\t\tBackward char.
-\\[helm-ucs-persistent-delete]\t\tDelete char backward.")
-
-;;; Bookmark help
-;;
-;;
-(defvar helm-bookmark-help-message
- "* Helm bookmark name
-
-** 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.")
-
-;;; Eshell command on file help
-;;
-;;
-(defvar helm-esh-help-message
- "* Helm eshell on file
-
-** Tips
-
-*** Passing extra args after filename
-
-Normally your command or alias will be called with file as argument. E.g.,
-
- <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 your command will look at this:
-
- <command> 'candidate_file' [extra_args]
-
-*** Specify many files as args (marked files)
-
-E.g. <command> file1 file2 ...
-
-Call `helm-find-files-eshell-command-on-file' with one prefix-arg
-Otherwise you can pass one prefix-arg from the command selection buffer.
-NOTE: This is not working on remote files.
-
-With two prefix-arg before starting or from the command selection buffer
-the output is printed to your `current-buffer'.
-
-Note that with no prefix-arg or a prefix-arg value of '(16) (C-u C-u)
-the command is called once for each file like this:
-
- <command> file1 <command> file2 etc...
-
-** Commands
-\\<helm-esh-on-file-map>")
-
-;;; Ido virtual buffer help
-;;
-;;
-(defvar helm-buffers-ido-virtual-help-message
- "* Helm ido virtual buffers
-
-** Commands
-\\<helm-buffers-ido-virtual-map>
-\\[helm-ff-run-switch-other-window]\t\tSwitch other window.
-\\[helm-ff-run-switch-other-frame]\t\tSwitch 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.")
-
-;;; Moccur help
-;;
-;;
-(defvar helm-moccur-help-message
- "* Helm Moccur
-
-** Tips
-
-*** Matching
-
-Multiple regexp matching is allowed, just enter a space to separate your regexps.
-
-Matching empty lines is supported with the regexp \"^$\", you will get the results
-with only the buffer-name and the line number, you can of course save and edit these
-results (i.e add text to the empty line) .
-
-*** Automatically matching symbol at point
-
-You can match automatically the symbol at point, but keeping
-the minibuffer empty ready to write into.
-This is disabled by default, to enable this you have to add `helm-source-occur'
-and `helm-source-moccur' to `helm-sources-using-default-as-input'.
-
-*** Jump to the corresponding line in the searched buffer
-
-You can do this with `C-j' (persistent-action), to do it repetitively
-you can use `C-<up>' and `C-<down>' or enable `helm-follow-mode' with `C-c C-f'.
-
-*** Saving results
-
-Same as with helm-grep, you can save the results with `C-x C-s'.
-Of course if you don't save your results, you can get back your session
-with `helm-resume'.
-
-*** Refreshing the resumed session.
-
-When the buffer(s) where you ran helm-(m)occur have been modified, you will be
-warned of this with the buffer flashing to red, you can refresh the buffer by running
-`C-c C-u'.
-This can be done automatically by customizing `helm-moccur-auto-update-on-resume'.
-
-*** Refreshing a saved buffer
-
-Type `g' to update your buffer.
-
-*** Edit a saved buffer
-
-First, install wgrep https://github.com/mhayashi1120/Emacs-wgrep
-and then:
-
-1) C-c C-p to edit the buffer(s).
-2) C-x C-s to save your changes.
-
-Tip: Use the excellent iedit https://github.com/tsdh/iedit
-to modify occurences in your buffer.
-
-** Commands
-\\<helm-moccur-map>
-\\[helm-goto-next-file]\t\tNext Buffer.
-\\[helm-goto-precedent-file]\t\tPrecedent Buffer.
-\\[helm-yank-text-at-point]\t\tYank Text at point in minibuffer.
-\\[helm-moccur-run-goto-line-ow]\t\tGoto line in other window.
-\\[helm-moccur-run-goto-line-of]\t\tGoto line in new frame.")
-
-;;; Helm Top
-;;
-;;
-(defvar helm-top-help-message
- "* Helm Top
-
-** Tips
-
-** 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.")
-
-;;; Helm Apt
-;;
-;;
-(defvar helm-apt-help-message
- "* Helm Apt
-
-** Tips
-
-** Commands
-\\<helm-apt-map>
-\\[helm-apt-show-all]\t\tShow all packages.
-\\[helm-apt-show-only-installed]\t\tShow installed packages only.
-\\[helm-apt-show-only-not-installed]\t\tShow not installed packages only.
-\\[helm-apt-show-only-deinstalled]\t\tShow deinstalled (not purged yet) packages only.>")
-
-;;; Helm elisp package
-;;
-;;
-(defvar helm-el-package-help-message
- "* Helm elisp package
-
-** Tips
-
-*** Compile all your packages asynchronously
-
-When using async (if you have installed from MELPA you do), only helm, helm-core,
-and magit are compiled asynchronously, if you want all your packages compiled async,
-add to your init file:
-
- (setq async-bytecomp-allowed-packages '(all))
-
-*** Upgrade elisp packages
-
-On initial start (when emacs is fetching packages on remote), if helm find
-package to upgrade it will start in the upgradables packages view showing the packages
-availables to upgrade.
-On further starts, you will have to refresh the list with `C-c C-u', if helm find upgrades
-you will have a message telling you some packages are available for upgrade, you can switch to
-upgrade view (see below) to see what packages are available for upgrade or just hit `C-c U'.
-to upgrade all.
-
-To see upgradables packages hit <M-U>.
-
-Then you can install all upgradables packages with the upgrade all action (`C-c C-u'),
-or upgrade only the specific packages by marking them (the new ones) and running
-the upgrade action (visible only when there is upgradables packages).
-Of course you can upgrade a single package by just running the upgrade action
-without marking it (`C-c u' or RET) .
-
-\*WARNING* You are strongly advised to RESTART emacs after UPGRADING packages.
-
-*** Meaning of flags prefixing packages (Emacs-25)
-
-- The flag \"S\" that prefix package names mean that this package is one of `package-selected-packages'.
-This feature is only available with emacs-25.
-
-- The flag \"U\" that prefix package names mean that this package is no more needed.
-This feature is only available with emacs-25.
-
-** 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 not installed packages only.
-\\[helm-el-package-show-upgrade]\t\tShow upgradable 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 upgradables.
-\\[helm-el-run-visit-homepage]\t\tVisit package homepage.")
-
-;;; Helm M-x
-;;
-;;
-(defvar helm-M-x-help-message
- "* Helm M-x
-
-** Tips
-
-*** You can get help on any command with persistent action (C-j)
-
-*** Prefix Args
-
-All the prefix args passed BEFORE running `helm-M-x' are ignored,
-you should get an error message if you do so.
-When you want to pass prefix args, pass them AFTER starting `helm-M-x',
-you will see a prefix arg counter appearing in mode-line notifying you
-the number of prefix args entered.")
-
-;;; helm-imenu
-;;
-;;
-(defvar helm-imenu-help-message
- "* Helm imenu
-
-** Tips
-
-** Commands
-\\<helm-imenu-map>
-\\[helm-imenu-next-section]\t\tGo to next section.
-\\[helm-imenu-previous-section]\t\tGo to previous section.")
-
-;;; helm-colors
-;;
-;;
-(defvar helm-colors-help-message
- "* Helm colors
-
-** Commands
-\\<helm-color-map>
-\\[helm-color-run-insert-name]\t\tInsert the entry'name.
-\\[helm-color-run-kill-name]\t\tKill the entry's name.
-\\[helm-color-run-insert-rgb]\t\tInsert entry in RGB format.
-\\[helm-color-run-kill-rgb]\t\tKill entry in RGB format.")
-
-;;; helm semantic
-;;
-;;
-(defvar helm-semantic-help-message
- "* Helm semantic
-
-** Tips
-
-** Commands
-\\<helm-semantic-map>")
-
-;;; helm kmacro
-;;
-;;
-(defvar helm-kmacro-help-message
- "* Helm kmacro
-
-** Tips
-
-- Start recording some keys with `f3'
-- Record new kmacro with `f4'
-- Start `helm-execute-kmacro' to list all your macros.
-
-Use persistent action to run your kmacro as many time as needed,
-you can change of kmacro with `helm-next-line' `helm-previous-line'.
-
-NOTE: You can't record keys running helm commands except `helm-M-x' unless
-you don't choose from there a command using helm completion.
-
-** Commands
-\\<helm-kmacro-map>")
-
-\f
-;;; Mode line strings
-;;
-;;
-;;;###autoload
-(defvar helm-comp-read-mode-line "\
-\\<helm-comp-read-map>\
-C/\\[helm-cr-empty-string]:Empty \
-\\<helm-map>\
-\\[helm-help]:Help \
-\\[helm-select-action]:Act \
-\\[helm-maybe-exit-minibuffer]/\
-f1/f2/f-n:NthAct \
-\\[helm-toggle-suspend-update]:Tog.suspend")
-
-;;;###autoload
-(defvar helm-read-file-name-mode-line-string "\
-\\<helm-read-file-map>\
-\\[helm-help]:Help \
-C/\\[helm-cr-empty-string]:Empty \
-\\<helm-map>\
-\\[helm-select-action]:Act \
-\\[helm-maybe-exit-minibuffer]/\
-f1/f2/f-n:NthAct \
-\\[helm-toggle-suspend-update]:Tog.suspend"
- "String displayed in mode-line in `helm-source-find-files'.")
-
-;;;###autoload
-(defvar helm-top-mode-line "\
-\\<helm-top-map>\
-\\[helm-help]:Help \
-\\<helm-map>\
-\\[helm-select-action]:Act \
-\\[helm-maybe-exit-minibuffer]/\
-f1/f2/f-n:NthAct \
-\\[helm-toggle-suspend-update]:Tog.suspend")
-
-\f
-;;; Attribute Documentation
-;;
-;;
-;;;###autoload
-(defun helm-describe-helm-attribute (helm-attribute)
- "Display the full documentation of HELM-ATTRIBUTE.
-HELM-ATTRIBUTE should be a symbol."
- (interactive (list (intern
- (completing-read
- "Describe helm attribute: "
- (mapcar 'symbol-name helm-attributes)
- nil t))))
- (with-output-to-temp-buffer "*Help*"
- (princ (get helm-attribute 'helm-attrdoc))))
-
-(helm-document-attribute 'name "mandatory"
- " The name of the source. It is also the heading which appears
- above the list of matches from the source. Must be unique.")
-
-(helm-document-attribute 'header-name "optional"
- " 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.")
-
-(helm-document-attribute 'candidates "mandatory if candidates-in-buffer attribute is not provided"
- " 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.
-
- 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.
-
- If the candidates have to be retrieved asynchronously (for
- example, by an external command which takes a while to run)
- then the function should start the external command
- asynchronously and return the associated process object.
- Helm will take care of managing the process (receiving the
- output from it, killing it if necessary, etc.). The process
- should return candidates matching the current pattern (see
- variable `helm-pattern'.)
- You should use instead `candidates-process' attribute for
- async processes, a warning will popup when using async process
- in a `candidates' attribute.
-
- Note that currently results from asynchronous sources appear
- last in the helm buffer regardless of their position in
- `helm-sources'.")
-
-(helm-document-attribute 'candidates-process
- "Same as `candidates' attributes but for process function."
- " You should use this attribute when using a function involving
- an async process instead of `candidates'.")
-
-(helm-document-attribute 'action "mandatory if type attribute is not provided"
- " It is a list of (DISPLAY . FUNCTION) pairs or 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.")
-
-(helm-document-attribute 'coerce "optional"
- " 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)")
-
-(helm-document-attribute 'type "optional if action attribute is provided"
- " Indicates the type of the items the source returns.
-
- Merge attributes not specified in the source itself from
- `helm-type-attributes'.
-
- This attribute is implemented by plug-in.")
-
-(helm-document-attribute 'init "optional"
- " 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.
-
- For example, if a source needs to work with the current
- directory then it can store its value here, because later
- helm does its job in the minibuffer and in the
- `helm-buffer' and the current directory can be different
- there.")
-
-(helm-document-attribute 'match "optional"
- " 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').
-
- 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'), since they perform pattern matching
- themselves.")
-
-(helm-document-attribute 'candidate-transformer "optional"
- " 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.")
-
-(helm-document-attribute 'filtered-candidate-transformer "optional"
- " 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 dislpayed 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.
-
- This option has no effect for asynchronous sources. (Not yet,
- at least.")
-
-(helm-document-attribute 'action-transformer "optional"
- " 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.")
-
-(helm-document-attribute 'pattern-transformer "optional"
- " 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'.")
-
-(helm-document-attribute 'delayed "optional"
- " Candidates from the source are shown only if the user stops
- typing and is idle for `helm-idle-delay' seconds.
- If a value is given to delayed attr, this value is used instead only
- if it is > to `helm-idle-delay'.")
-
-(helm-document-attribute 'volatile "optional"
- " 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.")
-
-(helm-document-attribute 'requires-pattern "optional"
- " 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.")
-
-(helm-document-attribute 'persistent-action "optional"
- " 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.")
-
-(helm-document-attribute 'candidates-in-buffer "optional"
- " Shortcut attribute for making and narrowing candidates using
- buffers. This newly-introduced attribute prevents us from
- forgetting to add volatile and match attributes.
-
- See docstring of `helm-candidates-in-buffer'.
-
- (candidates-in-buffer) is equivalent of three attributes:
- (candidates . helm-candidates-in-buffer)
- (volatile)
- (match identity)
-
- (candidates-in-buffer . candidates-function) is equivalent of:
- (candidates . candidates-function)
- (volatile)
- (match identity)
-
- This attribute is implemented by plug-in.")
-
-(helm-document-attribute 'search "optional"
- " 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'. This attribute is meant to be used with
- (candidates . helm-candidates-in-buffer) or
- (candidates-in-buffer) in short.")
-
-(helm-document-attribute 'get-line "optional"
- " A function like `buffer-substring-no-properties' or `buffer-substring'.
- This function converts point of line-beginning and point of line-end,
- which represents a candidate computed by `helm-candidates-in-buffer'.
- By default, `helm-candidates-in-buffer' uses
- `buffer-substring-no-properties'.")
-
-(helm-document-attribute 'display-to-real "optional"
- " Function called with one parameter; the selected candidate.
-
- The function transforms the selected candidate, and the result
- is passed to the action function. The display-to-real
- attribute provides another way to pass other string than one
- shown in Helm buffer.
-
- Traditionally, it is possible to make candidates,
- candidate-transformer or filtered-candidate-transformer
- function return a list with (DISPLAY . REAL) pairs. But if REAL
- can be generated from DISPLAY, display-to-real is more
- convenient and faster.")
-
-(helm-document-attribute 'real-to-display "optional"
- " Function called with one parameter; the selected candidate.
-
- The inverse of display-to-real attribute.
-
- The function transforms the selected candidate, which is passed
- to the action function, for display. The real-to-display
- attribute provides the other way to pass other string than one
- shown in Helm buffer.
-
- Traditionally, it is possible to make candidates,
- candidate-transformer or filtered-candidate-transformer
- function return a list with (DISPLAY . REAL) pairs. But if
- DISPLAY can be generated from REAL, real-to-display is more
- convenient.
-
- Note that DISPLAY parts returned from candidates /
- candidate-transformer are IGNORED as the name `display-to-real'
- says.")
-
-(helm-document-attribute 'cleanup "optional"
- " 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.")
-
-(helm-document-attribute 'candidate-number-limit "optional"
- " Override `helm-candidate-number-limit' only for this source.")
-
-(helm-document-attribute 'accept-empty "optional"
- " Pass empty string \"\" to action function.")
-
-(helm-document-attribute 'dummy "optional"
- " Set `helm-pattern' to candidate. If this attribute is
- specified, The candidates attribute is ignored.
-
- This attribute is implemented by plug-in.")
-
-(helm-document-attribute 'multiline "optional"
- " Enable to selection multiline candidates.")
-
-(helm-document-attribute 'update "optional"
- (substitute-command-keys
- " Function called with no parameters at before \"init\" function when \
-\\<helm-map>\\[helm-force-update] is pressed."))
-
-(helm-document-attribute 'mode-line "optional"
- " Source local `helm-mode-line-string' (included in
- `mode-line-format'). It accepts also variable/function name.")
-
-(helm-document-attribute 'header-line "optional"
- " Source local `header-line-format'.
- It accepts also variable/function name. ")
-
-(helm-document-attribute
- 'resume "optional"
- " 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.")
-
-(helm-document-attribute 'keymap "optional"
- " Specific keymap for this source.
- It is useful to have a keymap per source when using more than
- one source. Otherwise, a keymap can be set per command with
- `helm' argument KEYMAP. NOTE: when a source have `helm-map' as
- keymap attr, the global value of `helm-map' will override the
- actual local one.")
-
-(helm-document-attribute 'help-message "optional"
- " Help message for this source.
- If not present, `helm-help-message' value will be used.")
-
-(helm-document-attribute 'match-part "optional"
- " Allow matching candidate in the line with `candidates-in-buffer'.
- In candidates-in-buffer sources, match is done with
- `re-search-forward' which allow matching only a regexp on the
- `helm-buffer'; when this search is done, match-part allow
- matching only a specific part of the current line e.g. with a
- line like this:
-
- filename:candidate-containing-the-word-filename
-
- What you want is to ignore \"filename\" part and match only
- \"candidate-containing-the-word-filename\"
-
- So give a function matching only the part of candidate after \":\"
-
- 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.
-
- NOTE: This have effect only on sources using
- `candidates-in-buffer'.")
-
-(helm-document-attribute 'match-strict "optional"
- " 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. For anonymous
- function don't add the dot, e.g:
-
- \(match-strict (lambda () (foo))).")
-
-(helm-document-attribute 'nohighlight "optional"
- " Disable highlight match in this source.")
-
-(helm-document-attribute 'no-matchplugin "optional"
- " Disable matchplugin for this source.")
-
-(helm-document-attribute 'history "optional"
- " Allow passing history variable to helm from source.
- It should be a quoted symbol evaluated from source, i.e:
- (history . ,'history-var)")
-
-(helm-document-attribute 'follow "optional"
- " Enable `helm-follow-mode' for this source only.
- You must give it a value of 1 or -1, though giving a -1 value
- is surely not what you want, e.g: (follow . 1)
-
- See `helm-follow-mode' for more infos")
-
-(helm-document-attribute 'follow-delay "optional"
- " `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'.")
-
-(helm-document-attribute 'allow-dups "optional"
- " Allow helm collecting duplicates candidates.")
-
-(helm-document-attribute 'filter-one-by-one "optional"
- " 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 `candidates-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 `candidates-transformer'
- these functions should treat the candidates transformed by the `filter-one-by-one'
- function in consequence.")
-
-(helm-document-attribute 'nomark "optional"
- " Don't allow marking candidates when this attribute is present.")
-
-(provide 'helm-help)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-help.el ends here
+++ /dev/null
-;;; helm-id-utils.el --- Helm interface for id-utils. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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-grep)
-(require 'helm-help)
-
-(defgroup helm-id-utils nil
- "ID-Utils related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-gid-program "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'."
- :group 'helm-id-utils
- :type 'file)
-
-(defcustom helm-gid-db-file-name "ID"
- "Name of a database file created by `mkid' command from `ID-utils'."
- :group 'helm-id-utils
- :type 'string)
-
-(defun helm-gid-candidates-process ()
- (let ((proc (start-process
- "gid" nil helm-gid-program
- "-r" helm-pattern)))
- (set (make-local-variable 'helm-grep-last-cmd-line)
- (format "%s -r %s" helm-gid-program helm-pattern))
- (prog1 proc
- (set-process-sentinel
- proc (lambda (_process event)
- (when (string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format "[Helm Gid process finished - (%s results)]"
- (max (1- (count-lines
- (point-min) (point-max)))
- 0))
- 'face 'helm-locate-finish))))
- (force-mode-line-update))
- (helm-log "Error: Gid %s"
- (replace-regexp-in-string "\n" "" event))))))))
-
-(defun helm-gid-filtered-candidate-transformer (candidates _source)
- ;; "gid -r" may add dups in some rare cases.
- (cl-loop for c in (helm-fast-remove-dups candidates :test 'equal)
- collect (helm-grep--filter-candidate-1 c)))
-
-(defclass helm-gid-source (helm-source-async)
- ((header-name
- :initform
- (lambda (name)
- (concat name " [" (helm-attr 'db-dir) "]")))
- (db-dir :initarg :db-dir
- :initform nil
- :custom string
- :documentation " Location of ID file.")
- (candidates-process :initform #'helm-gid-candidates-process)
- (filtered-candidate-transformer
- :initform #'helm-gid-filtered-candidate-transformer)
- (candidate-number-limit :initform 99999)
- (action :initform (helm-make-actions
- "Find File" 'helm-grep-action
- "Find file other frame" 'helm-grep-other-frame
- (lambda () (and (locate-library "elscreen")
- "Find file in Elscreen"))
- 'helm-grep-jump-elscreen
- "Save results in grep buffer" 'helm-grep-save-results
- "Find file other window" 'helm-grep-other-window))
- (persistent-action :initform 'helm-grep-persistent-action)
- (history :initform 'helm-grep-history)
- (nohighlight :initform t)
- (help-message :initform 'helm-grep-help-message)
- (requires-pattern :initform 2)))
-
-;;;###autoload
-(defun helm-gid ()
- "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/>."
- (interactive)
- (let* ((db (locate-dominating-file
- default-directory
- helm-gid-db-file-name))
- (helm-grep-default-directory-fn
- (lambda () default-directory))
- (helm--maybe-use-default-as-input t))
- (cl-assert db nil "No DataBase found, create one with `mkid'")
- (helm :sources (helm-make-source "Gid" 'helm-gid-source
- :db-dir db)
- :buffer "*helm gid*"
- :keymap helm-grep-map
- :truncate-lines helm-grep-truncate-lines)))
-
-(provide 'helm-id-utils)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-id-utils ends here
+++ /dev/null
-;;; helm-imenu.el --- Helm interface for Imenu -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'imenu)
-(require 'helm-utils)
-(require 'helm-help)
-
-\f
-(defgroup helm-imenu nil
- "Imenu related libraries and applications for helm."
- :group 'helm)
-
-(defcustom helm-imenu-delimiter " / "
- "Delimit types of candidates and his value in `helm-buffer'."
- :group 'helm-imenu
- :type 'string)
-
-(defcustom helm-imenu-execute-action-at-once-if-one
- #'helm-imenu--execute-action-at-once-p
- "Goto the candidate when only one is remaining."
- :group 'helm-imenu
- :type 'function)
-
-(defcustom helm-imenu-lynx-style-map t
- "Use Arrow keys to jump to occurences."
- :group 'helm-imenu
- :type 'boolean)
-
-\f
-;;; keymap
-(defvar helm-imenu-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-imenu-next-section)
- (define-key map (kbd "M-<up>") 'helm-imenu-previous-section)
- (when helm-imenu-lynx-style-map
- (define-key map (kbd "<left>") 'helm-maybe-exit-minibuffer)
- (define-key map (kbd "<right>") 'helm-execute-persistent-action))
- (delq nil map)))
-
-(defun helm-imenu-next-or-previous-section (n)
- (with-helm-buffer
- (let* ((fn (lambda ()
- (car (split-string (helm-get-selection nil t)
- helm-imenu-delimiter))))
- (curtype (funcall fn))
- (move-fn (if (> n 0) #'helm-next-line #'helm-previous-line))
- (stop-fn (if (> n 0)
- #'helm-end-of-source-p
- #'helm-beginning-of-source-p)))
- (catch 'break
- (while (not (funcall stop-fn))
- (funcall move-fn)
- (unless (string= curtype (funcall fn))
- (throw 'break nil)))))))
-
-(defun helm-imenu-next-section ()
- (interactive)
- (helm-imenu-next-or-previous-section 1))
-
-(defun helm-imenu-previous-section ()
- (interactive)
- (helm-imenu-next-or-previous-section -1))
-
-\f
-;;; Internals
-(defvar helm-cached-imenu-alist nil)
-(make-variable-buffer-local 'helm-cached-imenu-alist)
-
-(defvar helm-cached-imenu-candidates nil)
-(make-variable-buffer-local 'helm-cached-imenu-candidates)
-
-(defvar helm-cached-imenu-tick nil)
-(make-variable-buffer-local 'helm-cached-imenu-tick)
-
-\f
-(defvar helm-source-imenu nil "See (info \"(emacs)Imenu\")")
-(defvar helm-source-imenu-all nil)
-
-(defclass helm-imenu-source (helm-source-sync)
- ((candidates :initform 'helm-imenu-candidates)
- (candidate-transformer :initform 'helm-imenu-transformer)
- (persistent-action :initform 'helm-imenu-persistent-action)
- (persistent-help :initform "Show this entry")
- (keymap :initform helm-imenu-map)
- (help-message :initform 'helm-imenu-help-message)
- (action :initform 'helm-imenu-action)))
-
-(defcustom helm-imenu-fuzzy-match nil
- "Enable fuzzy matching in `helm-source-imenu'."
- :group 'helm-imenu
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-imenu
- (helm-make-source "Imenu" 'helm-imenu-source
- :fuzzy-match helm-imenu-fuzzy-match))))
-\f
-(defun helm-imenu--maybe-switch-to-buffer (candidate)
- (helm-aif (marker-buffer (cdr candidate))
- (switch-to-buffer it)))
-
-(defun helm-imenu--execute-action-at-once-p ()
- (let ((cur (helm-get-selection))
- (mb (with-helm-current-buffer
- (save-excursion
- (goto-char (point-at-bol))
- (point-marker)))))
- (if (equal (cdr cur) mb)
- (prog1 nil
- (helm-set-pattern "")
- (helm-force-update))
- t)))
-
-(defun helm-imenu-action (candidate)
- "Default action for `helm-source-imenu'."
- (helm-log-run-hook 'helm-goto-line-before-hook)
- (helm-imenu--maybe-switch-to-buffer candidate)
- (imenu candidate)
- ;; If semantic is supported in this buffer
- ;; imenu used `semantic-imenu-goto-function'
- ;; and position have been highlighted,
- ;; no need to highlight again.
- (unless (eq imenu-default-goto-function
- 'semantic-imenu-goto-function)
- (helm-highlight-current-line nil nil nil nil 'pulse)))
-
-(defun helm-imenu-persistent-action (candidate)
- "Default persistent action for `helm-source-imenu'."
- (helm-imenu--maybe-switch-to-buffer candidate)
- (imenu candidate)
- (helm-highlight-current-line))
-
-(defun helm-imenu-candidates (&optional buffer)
- (with-current-buffer (or buffer helm-current-buffer)
- (let ((tick (buffer-modified-tick)))
- (if (eq helm-cached-imenu-tick tick)
- helm-cached-imenu-candidates
- (setq imenu--index-alist nil)
- (prog1 (setq helm-cached-imenu-candidates
- (let ((index (imenu--make-index-alist t)))
- (helm-imenu--candidates-1
- (delete (assoc "*Rescan*" index) index))))
- (setq helm-cached-imenu-tick tick))))))
-
-(defun helm-imenu-candidates-in-all-buffers ()
- (let* ((lst (buffer-list))
- (progress-reporter (make-progress-reporter
- "Imenu indexing buffers..." 1 (length lst))))
- (prog1
- (cl-loop for b in lst
- for count from 1
- for mm = (with-current-buffer b major-mode)
- for cmm = (with-helm-current-buffer major-mode)
- when (or (with-helm-current-buffer
- (derived-mode-p mm))
- (with-current-buffer b
- (derived-mode-p cmm)))
- do (progress-reporter-update progress-reporter count)
- and
- append (with-current-buffer b
- (helm-imenu-candidates b)))
- (progress-reporter-done progress-reporter))))
-
-(defun helm-imenu--candidates-1 (alist)
- (cl-loop for elm in alist
- nconc (if (imenu--subalist-p elm)
- (helm-imenu--candidates-1
- (cl-loop for (e . v) in (cdr elm) collect
- (cons (propertize
- e 'helm-imenu-type (car elm))
- ;; 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].
- (if (integerp v) (copy-marker v) v))))
- (and (cdr elm) ; bug in imenu, should not be needed.
- (setcdr elm (copy-marker (cdr elm))) ; Same as [1].
- (list elm)))))
-
-(defun helm-imenu--get-prop (item)
- ;; property value of ITEM can have itself
- ;; a property value which have itself a property value
- ;; ...and so on; Return a list of all these
- ;; properties values starting at ITEM.
- (let* ((prop (get-text-property 0 'helm-imenu-type item))
- (lst (list prop item)))
- (when prop
- (while prop
- (setq prop (get-text-property 0 'helm-imenu-type prop))
- (and prop (push prop lst)))
- lst)))
-
-(defun helm-imenu-transformer (candidates)
- (cl-loop for (k . v) in candidates
- for types = (or (helm-imenu--get-prop k)
- (list "Function" k))
- for bufname = (buffer-name (marker-buffer v))
- for disp1 = (mapconcat
- (lambda (x)
- (propertize
- x 'face (cond ((string= x "Variables")
- 'font-lock-variable-name-face)
- ((string= x "Function")
- 'font-lock-function-name-face)
- ((string= x "Types")
- 'font-lock-type-face))))
- types helm-imenu-delimiter)
- for disp = (propertize disp1 'help-echo bufname)
- collect
- (cons disp (cons k v))))
-\f
-;;;###autoload
-(defun helm-imenu ()
- "Preconfigured `helm' for `imenu'."
- (interactive)
- (unless helm-source-imenu
- (setq helm-source-imenu
- (helm-make-source "Imenu" 'helm-imenu-source
- :fuzzy-match helm-imenu-fuzzy-match)))
- (let ((imenu-auto-rescan t)
- (str (thing-at-point 'symbol))
- (helm-execute-action-at-once-if-one
- helm-imenu-execute-action-at-once-if-one))
- (helm :sources 'helm-source-imenu
- :default (list (concat "\\_<" str "\\_>") str)
- :preselect str
- :buffer "*helm imenu*")))
-
-;;;###autoload
-(defun helm-imenu-in-all-buffers ()
- "Preconfigured helm for fetching imenu entries of all buffers."
- (interactive)
- (unless helm-source-imenu-all
- (setq helm-source-imenu-all
- (helm-make-source "Imenu in all buffers" 'helm-imenu-source
- :candidates 'helm-imenu-candidates-in-all-buffers
- :fuzzy-match helm-imenu-fuzzy-match)))
- (let ((imenu-auto-rescan t)
- (str (thing-at-point 'symbol))
- (helm-execute-action-at-once-if-one
- helm-imenu-execute-action-at-once-if-one))
- (helm :sources 'helm-source-imenu-all
- :default (list (concat "\\_<" str "\\_>") str)
- :preselect (unless (memq 'helm-source-imenu-all
- helm-sources-using-default-as-input)
- str)
- :buffer "*helm imenu all*")))
-
-(provide 'helm-imenu)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-imenu.el ends here
+++ /dev/null
-;;; helm-info.el --- Browse info index with helm -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-plugin)
-
-(declare-function Info-index-nodes "info" (&optional file))
-(declare-function Info-goto-node "info" (&optional fork))
-(declare-function Info-find-node "info.el" (filename nodename &optional no-going-back))
-(defvar Info-history)
-
-\f
-(defgroup helm-info nil
- "Info related Applications and libraries for Helm."
- :group 'helm)
-
-;;; Build info-index sources with `helm-info-source' class.
-;;
-;;
-(cl-defun helm-info-init (&optional (file (helm-attr 'info-file)))
- ;; Allow reinit candidate buffer when using edebug.
- (helm-aif (and debug-on-error
- (helm-candidate-buffer))
- (kill-buffer it))
- (unless (helm-candidate-buffer)
- (save-window-excursion
- (info file)
- (let ((tobuf (helm-candidate-buffer 'global))
- (infobuf (current-buffer))
- Info-history
- start end)
- (cl-dolist (node (Info-index-nodes))
- (Info-goto-node node)
- (goto-char (point-min))
- (while (search-forward "\n* " nil t)
- (unless (search-forward "Menu:\n" (1+ (point-at-eol)) t)
- (setq start (point-at-bol)
- end (point-at-eol))
- (with-current-buffer tobuf
- (insert-buffer-substring infobuf start end)
- (insert "\n")))))))))
-
-(defun helm-info-goto (node-line)
- (Info-goto-node (car node-line))
- (helm-goto-line (cdr node-line)))
-
-(defun helm-info-display-to-real (line)
- (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))
- (string-to-number (or (match-string 3 line) "1")))))
-
-(defclass helm-info-source (helm-source-in-buffer)
- ((info-file :initarg :info-file
- :initform nil
- :custom 'string)
- (init :initform #'helm-info-init)
- (display-to-real :initform #'helm-info-display-to-real)
- (get-line :initform #'buffer-substring)
- (action :initform '(("Goto node" . helm-info-goto)))))
-
-(defmacro helm-build-info-source (fname &rest args)
- `(helm-make-source (concat "Info Index: " ,fname) 'helm-info-source
- :info-file ,fname ,@args))
-
-(defun helm-build-info-index-command (name doc source buffer)
- "Define an helm command NAME with documentation DOC.
-Arg SOURCE will be an existing helm source named
-`helm-source-info-<NAME>' and BUFFER a string buffer name."
- (defalias (intern (concat "helm-info-" name))
- (lambda ()
- (interactive)
- (helm :sources source
- :buffer buffer
- :candidate-number-limit 1000))
- doc))
-
-(defun helm-define-info-index-sources (var-value &optional commands)
- "Define helm sources named helm-source-info-<NAME>.
-Sources are generated for all entries of `helm-default-info-index-list'.
-If COMMANDS arg is non--nil build also commands named `helm-info<NAME>'.
-Where NAME is one of `helm-default-info-index-list'."
- (cl-loop for str in var-value
- for sym = (intern (concat "helm-source-info-" str))
- do (set sym (helm-build-info-source str))
- when commands
- do (helm-build-info-index-command
- str (format "Predefined helm for %s info." str)
- sym (format "*helm info %s*" str))))
-
-(defun helm-info-index-set (var value)
- (set var value)
- (helm-define-info-index-sources value t))
-
-(defcustom helm-default-info-index-list
- '("elisp" "cl" "org" "gnus" "tramp" "ratpoison"
- "zsh" "bash" "coreutils" "fileutils"
- "find" "sh-utils" "textutils" "libc"
- "make" "automake" "autoconf" "eintr"
- "emacs" "elib" "eieio" "gauche-refe" "guile"
- "guile-tut" "goops" "screen" "latex" "gawk"
- "sed" "m4" "wget" "binutils" "as" "bfd" "gprof"
- "ld" "diff" "flex" "grep" "gzip" "libtool"
- "texinfo" "info" "gdb" "stabs" "cvsbook" "cvs"
- "bison" "id-utils" "global")
- "Info Manual entries to use for building helm info index commands."
- :group 'helm-info
- :type '(repeat (choice string))
- :set 'helm-info-index-set)
-
-(defcustom helm-info-default-sources
- '(helm-source-info-elisp
- helm-source-info-cl
- helm-source-info-eieio
- helm-source-info-pages)
- "The default sources to use in `helm-info-at-point'."
- :group 'helm-info
- :type '(repeat (choice symbol)))
-
-\f
-;;; Info pages
-(defvar helm-info--pages-cache nil
- "Cache for all info pages on system.")
-
-(defun helm-info-pages-init ()
- "Collect candidates for initial Info node Top."
- (if helm-info--pages-cache
- helm-info--pages-cache
- (let ((info-topic-regexp "\\* +\\([^:]+: ([^)]+)[^.]*\\)\\.")
- topics)
- (require 'info)
- (with-temp-buffer
- (Info-find-node "dir" "top")
- (goto-char (point-min))
- (while (re-search-forward info-topic-regexp nil t)
- (push (match-string-no-properties 1) topics))
- (kill-buffer))
- (setq helm-info--pages-cache topics))))
-
-(defvar helm-source-info-pages
- (helm-build-sync-source "Info Pages"
- :init #'helm-info-pages-init
- :candidates (lambda () helm-info--pages-cache)
- :action '(("Show with Info" .(lambda (node-str)
- (info (replace-regexp-in-string
- "^[^:]+: " "" node-str)))))
- :requires-pattern 2))
-
-;;;###autoload
-(defun helm-info-at-point ()
- "Preconfigured `helm' for searching info at point.
-With a prefix-arg insert symbol at point."
- (interactive)
- (helm :sources helm-info-default-sources
- :buffer "*helm info*"))
-
-(provide 'helm-info)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-info.el ends here
+++ /dev/null
-;;; helm-locate.el --- helm interface for locate. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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/>.
-
-;; NOTE for WINDOZE users:
-;; You have to install Everything with his command line interface here:
-;; http://www.voidtools.com/download.php
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'helm)
-(require 'helm-types)
-(require 'helm-help)
-
-\f
-(defgroup helm-locate nil
- "Locate related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-locate-db-file-regexp "m?locate\.db$"
- "Default regexp to match locate database.
-If nil Search in all files."
- :type 'string
- :group 'helm-locate)
-
-(defcustom helm-ff-locate-db-filename "locate.db"
- "The basename of the locatedb file you use locally in your directories.
-When this is set and `helm' find 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."
- :group 'helm-locate
- :type 'string)
-
-(defcustom helm-locate-command nil
- "A list of arguments for locate program.
-Normally you should not have to modify this yourself.
-
-If nil it will be calculated when `helm-locate' startup
-with these default values for different systems:
-
-Gnu/linux: \"locate %s -e -r %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 \"-r\" option must be the last option, however if not specified you will
-be able to specify it during helm invocation by prefixing the pattern
-you enter with \"-r\"."
- :type 'string
- :group 'helm-locate)
-
-(defcustom helm-locate-create-db-command
- "updatedb -l 0 -o %s -U %s"
- "Command used to create a locale locate db file."
- :type 'string
- :group 'helm-locate)
-
-(defcustom helm-locate-case-fold-search helm-case-fold-search
- "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."
- :group 'helm-locate
- :type 'symbol)
-
-(defcustom helm-locate-fuzzy-match nil
- "Enable fuzzy matching in `helm-locate'."
- :group 'helm-locate
- :type 'boolean)
-
-(defcustom helm-locate-project-list nil
- "A list of directories, your projects.
-When set, allow browsing recursively files in all
-directories of this list with `helm-projects-find-files'."
- :group 'helm-locate
- :type '(repeat string))
-
-\f
-(defvar helm-generic-files-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-]") 'helm-ff-run-toggle-basename)
- (define-key map (kbd "C-s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g z") 'helm-ff-run-zgrep)
- (define-key map (kbd "M-g p") 'helm-ff-run-pdfgrep)
- (define-key map (kbd "C-c g") 'helm-ff-run-gid)
- (define-key map (kbd "M-R") 'helm-ff-run-rename-file)
- (define-key map (kbd "M-C") 'helm-ff-run-copy-file)
- (define-key map (kbd "M-B") 'helm-ff-run-byte-compile-file)
- (define-key map (kbd "M-L") 'helm-ff-run-load-file)
- (define-key map (kbd "M-S") 'helm-ff-run-symlink-file)
- (define-key map (kbd "M-H") 'helm-ff-run-hardlink-file)
- (define-key map (kbd "M-D") 'helm-ff-run-delete-file)
- (define-key map (kbd "C-=") 'helm-ff-run-ediff-file)
- (define-key map (kbd "C-c =") 'helm-ff-run-ediff-merge-file)
- (define-key map (kbd "C-c o") 'helm-ff-run-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-ff-run-switch-other-frame)
- (define-key map (kbd "M-i") 'helm-ff-properties-persistent)
- (define-key map (kbd "C-c C-x") 'helm-ff-run-open-file-externally)
- (define-key map (kbd "C-c X") 'helm-ff-run-open-file-with-default-tool)
- (define-key map (kbd "M-.") 'helm-ff-run-etags)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- (define-key map (kbd "C-c @") 'helm-ff-run-insert-org-link)
- map)
- "Generic Keymap for files.")
-
-\f
-(defface helm-locate-finish
- '((t (:foreground "Green")))
- "Face used in mode line when locate process is finish."
- :group 'helm-locate)
-
-\f
-(defun helm-ff-find-locatedb (&optional from-ff)
- "Try to find if a local locatedb file is available.
-The search is done in `helm-ff-default-directory' or
-fall back to `default-directory' if FROM-FF is nil."
- (when helm-ff-locate-db-filename
- (cond ((and helm-ff-default-directory
- from-ff
- (file-exists-p (expand-file-name
- helm-ff-locate-db-filename
- helm-ff-default-directory))
- (expand-file-name
- helm-ff-locate-db-filename
- helm-ff-default-directory)))
- ((and (not from-ff)
- (file-exists-p (expand-file-name
- helm-ff-locate-db-filename
- default-directory))
- (expand-file-name
- helm-ff-locate-db-filename
- default-directory))))))
-
-
-(defun helm-locate-create-db-default-function (db-name directory)
- "Default function used to create a locale locate db file.
-Argument DB-NAME name of the db file.
-Argument DIRECTORY root of file system subtree to scan."
- (format helm-locate-create-db-command db-name directory))
-
-(defvar helm-locate-create-db-function
- #'helm-locate-create-db-default-function
- "Function used to create a locale locate db file.
-It should receive the same arguments as
-`helm-locate-create-db-default-function'.")
-
-(defun helm-locate-1 (&optional localdb init from-ff default)
- "Generic function to run Locate.
-Prefix arg LOCALDB when (4) search and use a local locate db file when it
-exists or create it, when (16) force update of existing db file
-even if exists.
-It have no effect when locate command is 'es'.
-INIT is a string to use as initial input in prompt.
-See `helm-locate-with-db' and `helm-locate'."
- (require 'helm-mode)
- (helm-locate-set-command)
- (let ((pfn (lambda (candidate)
- (if (file-directory-p candidate)
- (message "Error: The locate Db should be a file")
- (if (= (shell-command
- (funcall helm-locate-create-db-function
- candidate
- helm-ff-default-directory))
- 0)
- (message "New locatedb file `%s' created" candidate)
- (error "Failed to create locatedb file `%s'" candidate)))))
- (locdb (and localdb
- (not (string-match "^es" helm-locate-command))
- (or (and (equal '(4) localdb)
- (helm-ff-find-locatedb from-ff))
- (helm-read-file-name
- "Create Locate Db file: "
- :initial-input (expand-file-name "locate.db"
- (or helm-ff-default-directory
- default-directory))
- :preselect helm-locate-db-file-regexp
- :test (lambda (x)
- (if helm-locate-db-file-regexp
- ;; Select only locate db files and directories
- ;; to allow navigation.
- (or (string-match
- helm-locate-db-file-regexp x)
- (file-directory-p x))
- x)))))))
- (when (and locdb (or (equal localdb '(16))
- (not (file-exists-p locdb))))
- (funcall pfn locdb))
- (helm-locate-with-db (and localdb locdb) init default)))
-
-(defun helm-locate-set-command ()
- "Setup `helm-locate-command' if not already defined."
- (unless helm-locate-command
- (setq helm-locate-command
- (cl-case system-type
- (gnu/linux "locate %s -e -r %s")
- (berkeley-unix "locate %s %s")
- (windows-nt "es %s %s")
- (t "locate %s %s")))))
-
-(defvar helm-file-name-history nil)
-(defun helm-locate-with-db (&optional db initial-input default)
- "Run locate -d DB.
-If DB is not given or nil use locate without -d option.
-Argument DB can be given as a string or list of db files.
-Argument INITIAL-INPUT is a string to use as initial-input.
-See also `helm-locate'."
- (require 'helm-files)
- (when (and db (stringp db)) (setq db (list db)))
- (helm-locate-set-command)
- (let ((helm-locate-command
- (if db
- (replace-regexp-in-string
- "locate"
- (format "locate -d %s"
- (mapconcat 'identity
- ;; Remove eventually
- ;; marked directories by error.
- (cl-loop for i in db
- unless (file-directory-p i)
- collect i) ":"))
- helm-locate-command)
- helm-locate-command)))
- (setq helm-file-name-history (mapcar 'helm-basename file-name-history))
- (helm :sources 'helm-source-locate
- :buffer "*helm locate*"
- :ff-transformer-show-only-basename nil
- :input initial-input
- :default default
- :history 'helm-file-name-history)))
-
-(defun helm-locate-init ()
- "Initialize async locate process for `helm-source-locate'."
- (let* ((locate-is-es (string-match "\\`es" helm-locate-command))
- (real-locate (string-match "\\`locate" helm-locate-command))
- (case-sensitive-flag (if locate-is-es "-i" ""))
- (ignore-case-flag (if (or locate-is-es
- (not real-locate)) "" "-i"))
- (args (split-string helm-pattern " "))
- (cmd (format helm-locate-command
- (cl-case helm-locate-case-fold-search
- (smart (let ((case-fold-search nil))
- (if (string-match "[[:upper:]]" helm-pattern)
- case-sensitive-flag
- ignore-case-flag)))
- (t (if helm-locate-case-fold-search
- ignore-case-flag
- case-sensitive-flag)))
- (concat
- ;; The pattern itself.
- (shell-quote-argument (car args)) " "
- ;; Possible locate args added
- ;; after pattern, don't quote them.
- (mapconcat 'identity (cdr args) " ")))))
- (helm-log "Starting helm-locate process")
- (helm-log "Command line used was:\n\n%s"
- (concat ">>> " (propertize cmd 'face 'font-lock-comment-face) "\n\n"))
- (prog1
- (start-process-shell-command
- "locate-process" helm-buffer
- cmd)
- (set-process-sentinel
- (get-buffer-process helm-buffer)
- (lambda (_process event)
- (if (string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format "[Locate process finished - (%s results)]"
- (max (1- (count-lines
- (point-min) (point-max)))
- 0))
- 'face 'helm-locate-finish))))
- (force-mode-line-update))
- (helm-log "Error: Locate %s"
- (replace-regexp-in-string "\n" "" event))))))))
-
-(defclass helm-locate-source (helm-source-async helm-type-file)
- ((init :initform 'helm-locate-set-command)
- (candidates-process :initform 'helm-locate-init)
- (requires-pattern :initform 3)
- (history :initform 'helm-file-name-history)
- (keymap :initform helm-generic-files-map)
- (persistent-action :initform 'helm-ff-kill-or-find-buffer-fname)
- (help-message :initform 'helm-generic-file-help-message)
- (candidate-number-limit :initform 9999)))
-
-(defvar helm-source-locate
- (helm-make-source "Locate" 'helm-locate-source
- :pattern-transformer 'helm-locate-pattern-transformer))
-
-(defun helm-locate-pattern-transformer (pattern)
- (if helm-locate-fuzzy-match
- (cond ((string-match
- " " (replace-regexp-in-string " -b" "" pattern)) pattern)
- ((string-match "\\([^ ]*\\) -b" pattern)
- (concat (helm--mapconcat-pattern
- (match-string 1 pattern)) " -b"))
- (t (helm--mapconcat-pattern pattern)))
- pattern))
-
-(defun helm-locate-find-dbs-in-projects (&optional update)
- (let* ((pfn (lambda (candidate directory)
- (unless (= (shell-command
- (funcall helm-locate-create-db-function
- candidate
- directory))
- 0)
- (error "Failed to create locatedb file `%s'" candidate)))))
- (cl-loop for p in helm-locate-project-list
- for db = (expand-file-name
- helm-ff-locate-db-filename
- (file-name-as-directory p))
- if (and (null update) (file-exists-p db))
- collect db
- else do (funcall pfn db p)
- and collect db)))
-
-;;;###autoload
-(defun helm-projects-find-files (update)
- "Find files with locate in `helm-locate-project-list'.
-With a prefix arg refresh the database in each project."
- (interactive "P")
- (helm-locate-set-command)
- (cl-assert (and (string-match-p "\\`locate" helm-locate-command)
- (executable-find "updatedb"))
- nil "Unsupported locate version")
- (let ((dbs (helm-locate-find-dbs-in-projects update)))
- (if dbs
- (helm-locate-with-db dbs)
- (user-error "No projects found, please setup `helm-locate-project-list'"))))
-
-;;;###autoload
-(defun helm-locate-read-file-name (prompt)
- (let* ((src `((name . "Locate read fname")
- (init . helm-locate-set-command)
- (candidates-process . helm-locate-init)
- (action . identity)
- (requires-pattern . 3)
- (history . ,'helm-file-name-history)
- (candidate-transformer . (helm-skip-boring-files
- helm-highlight-files))
- (candidate-number-limit . 9999)
- (no-matchplugin))))
- (or (helm :sources src
- :ff-transformer-show-only-basename nil
- :prompt prompt
- :buffer "*helm locate read fname*"
- :resume 'noresume)
- (keyboard-quit))))
-
-;;;###autoload
-(defun 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'."
- (interactive "P")
- (setq helm-ff-default-directory default-directory)
- (helm-locate-1 arg nil nil (thing-at-point 'filename)))
-
-(provide 'helm-locate)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-locate.el ends here
+++ /dev/null
-;;; helm-man.el --- Man and woman UI -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-
-(defvar woman-topic-all-completions)
-(defvar woman-manpath)
-(defvar woman-path)
-(defvar woman-expanded-directory-path)
-(declare-function woman-file-name "woman.el" (topic &optional re-cache))
-(declare-function woman-file-name-all-completions "woman.el" (topic))
-(declare-function Man-getpage-in-background "man.el" (topic))
-(declare-function woman-expand-directory-path "woman.el" (path-dirs path-regexps))
-(declare-function woman-topic-all-completions "woman.el" (path))
-(declare-function helm-generic-sort-fn "helm-utils.el" (S1 S2))
-
-(defgroup helm-man nil
- "Man and Woman applications for helm."
- :group 'helm)
-
-(defcustom helm-man-or-woman-function 'Man-getpage-in-background
- "Default command to display a man page."
- :group 'helm-man
- :type '(radio :tag "Preferred command to display a man page"
- (const :tag "Man" Man-getpage-in-background)
- (const :tag "Woman" woman)))
-
-(defcustom helm-man-format-switches "-l %s"
- "Arguments to pass to the `manual-entry' function.
-Arguments are passed to `manual-entry' with `format.'
-Default use \"-l\" which may not be supported on old man versions,
-in this case use \"%s\" as value to pass only the filename as argument.
-See Issue #1035"
- :group 'helm-man
- :type 'string)
-
-;; Internal
-(defvar helm-man--pages nil
- "All man pages on system.
-Will be calculated the first time you invoke helm with this
-source.")
-
-(defun helm-man-default-action (candidate)
- "Default action for jumping to a woman or man page from helm."
- (let ((wfiles (mapcar
- 'car (woman-file-name-all-completions candidate))))
- (condition-case nil
- (if (> (length wfiles) 1)
- (let ((file (helm-comp-read
- "ManFile: " wfiles :must-match t)))
- (if (eq helm-man-or-woman-function 'Man-getpage-in-background)
- (manual-entry (format helm-man-format-switches file))
- (woman-find-file file)))
- (funcall helm-man-or-woman-function candidate))
- ;; If woman is unable to format correctly
- ;; use man instead.
- (error (kill-buffer) ; Kill woman buffer.
- (Man-getpage-in-background candidate)))))
-
-(defun helm-man--init ()
- (require 'woman)
- (require 'helm-utils)
- (unless helm-man--pages
- (setq woman-expanded-directory-path
- (woman-expand-directory-path woman-manpath woman-path))
- (setq woman-topic-all-completions
- (woman-topic-all-completions woman-expanded-directory-path))
- (setq helm-man--pages (mapcar 'car woman-topic-all-completions)))
- (helm-init-candidates-in-buffer 'global helm-man--pages))
-
-(defvar helm-source-man-pages
- (helm-build-in-buffer-source "Manual Pages"
- :init #'helm-man--init
- :persistent-action #'ignore
- :filtered-candidate-transformer
- (lambda (candidates _source)
- (sort candidates #'helm-generic-sort-fn))
- :action '(("Display Man page" . helm-man-default-action))))
-
-;;;###autoload
-(defun helm-man-woman (arg)
- "Preconfigured `helm' for Man and Woman pages.
-With a prefix arg reinitialize the cache."
- (interactive "P")
- (when arg (setq helm-man--pages nil))
- (helm :sources 'helm-source-man-pages
- :buffer "*Helm man woman*"))
-
-(provide 'helm-man)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-man.el ends here
+++ /dev/null
-;;; helm-misc.el --- Various functions for helm -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-types)
-
-(declare-function display-time-world-display "time.el")
-(defvar display-time-world-list)
-
-\f
-(defgroup helm-misc nil
- "Various Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-time-zone-home-location "Paris"
- "The time zone of your home"
- :group 'helm-misc
- :type 'string)
-
-(defcustom helm-timezone-actions
- '(("Set timezone env (TZ)" . (lambda (candidate)
- (setenv "TZ" candidate))))
- "Actions for helm-timezone."
- :group 'helm-misc
- :type '(alist :key-type string :value-type function))
-
-(defcustom helm-mini-default-sources '(helm-source-buffers-list
- helm-source-recentf
- helm-source-buffer-not-found)
- "Default sources list used in `helm-mini'."
- :group 'helm-misc
- :type '(repeat (choice symbol)))
-
-(defface helm-time-zone-current
- '((t (:foreground "green")))
- "Face used to colorize current time in `helm-world-time'."
- :group 'helm-misc)
-
-(defface helm-time-zone-home
- '((t (:foreground "red")))
- "Face used to colorize home time in `helm-world-time'."
- :group 'helm-misc)
-
-
-\f
-;;; Latex completion
-(defvar LaTeX-math-menu)
-(defun helm-latex-math-candidates ()
- "Collect candidates for latex math completion."
- (cl-loop for i in (cddr LaTeX-math-menu)
- for elm = (cl-loop for s in i when (vectorp s)
- collect (cons (aref s 0) (aref s 1)))
- append elm))
-
-(defvar helm-source-latex-math
- '((name . "Latex Math Menu")
- (init . (lambda ()
- (with-helm-current-buffer
- (LaTeX-math-mode 1))))
- (candidate-number-limit . 9999)
- (candidates . helm-latex-math-candidates)
- (action . (lambda (candidate)
- (call-interactively candidate)))))
-
-\f
-;;; Jabber Contacts (jabber.el)
-(defun helm-jabber-online-contacts ()
- "List online Jabber contacts."
- (with-no-warnings
- (cl-loop for item in (jabber-concat-rosters)
- when (get item 'connected)
- collect
- (if (get item 'name)
- (cons (get item 'name) item)
- (cons (symbol-name item) item)))))
-
-(defvar helm-source-jabber-contacts
- '((name . "Jabber Contacts")
- (init . (lambda () (require 'jabber)))
- (candidates . (lambda () (mapcar 'car (helm-jabber-online-contacts))))
- (action . (lambda (x)
- (jabber-chat-with
- (jabber-read-account)
- (symbol-name
- (cdr (assoc x (helm-jabber-online-contacts)))))))))
-
-;;; World time
-;;
-(defun helm-time-zone-transformer (candidates _source)
- (cl-loop for i in candidates
- for (z . p) in display-time-world-list
- collect
- (cons
- (cond ((string-match (format-time-string "%H:%M" (current-time)) i)
- (propertize i 'face 'helm-time-zone-current))
- ((string-match helm-time-zone-home-location i)
- (propertize i 'face 'helm-time-zone-home))
- (t i))
- z)))
-
-(defvar helm-source-time-world
- (helm-build-in-buffer-source "Time World List"
- :data (lambda ()
- (with-temp-buffer
- (display-time-world-display display-time-world-list)
- (buffer-string)))
- :action 'helm-timezone-actions
- :filtered-candidate-transformer 'helm-time-zone-transformer))
-
-;;; LaCarte
-;;
-;;
-(declare-function lacarte-get-overall-menu-item-alist "ext:lacarte.el" (&optional MAPS))
-
-(defun helm-lacarte-candidate-transformer (cands)
- (mapcar (lambda (cand)
- (let* ((item (car cand))
- (match (string-match "[^>] \\((.*)\\)$" item)))
- (when match
- (put-text-property (match-beginning 1) (match-end 1)
- 'face 'helm-M-x-key item))
- cand))
- cands))
-
-(defclass helm-lacarte (helm-source-sync helm-type-command)
- ((init :initform (lambda () (require 'lacarte)))
- (candidates :initform 'helm-lacarte-get-candidates)
- (candidate-transformer :initform 'helm-lacarte-candidate-transformer)
- (candidate-number-limit :initform 9999)))
-
-(defun helm-lacarte-get-candidates (&optional maps)
- "Extract candidates for menubar using lacarte.el.
-See http://www.emacswiki.org/cgi-bin/wiki/download/lacarte.el.
-Optional argument MAPS is a list specifying which keymaps to use: it
-can contain the symbols `local', `global', and `minor', mean the
-current local map, current global map, and all current minor maps."
- (with-helm-current-buffer
- ;; FIXME: do we still need to remove possible '(nil) candidates.
- (lacarte-get-overall-menu-item-alist maps)))
-
-;;;###autoload
-(defun helm-browse-menubar ()
- "Preconfigured helm to the menubar using lacarte.el."
- (interactive)
- (require 'lacarte)
- (helm :sources (mapcar
- (lambda (spec) (helm-make-source (car spec) 'helm-lacarte
- :candidates (lambda () (helm-lacarte-get-candidates (cdr spec)))))
- '(("Major Mode" . (local))
- ("Minor Modes" . (minor))
- ("Global Map" . (global))))
- :buffer "*helm lacarte*"))
-
-(defun helm-call-interactively (cmd-or-name)
- "Execute CMD-OR-NAME as Emacs command.
-It is added to `extended-command-history'.
-`helm-current-prefix-arg' is used as the command's prefix argument."
- (setq extended-command-history
- (cons (helm-stringify cmd-or-name)
- (delete (helm-stringify cmd-or-name) extended-command-history)))
- (let ((current-prefix-arg helm-current-prefix-arg)
- (cmd (helm-symbolify cmd-or-name)))
- (if (stringp (symbol-function cmd))
- (execute-kbd-macro (symbol-function cmd))
- (setq this-command cmd)
- (call-interactively cmd))))
-
-;;; Minibuffer History
-;;
-;;
-(defvar helm-source-minibuffer-history
- (helm-build-sync-source "Minibuffer History"
- :header-name (lambda (name)
- (format "%s (%s)" name minibuffer-history-variable))
- :candidates
- (lambda ()
- (let ((history (cl-loop for i in
- (symbol-value minibuffer-history-variable)
- unless (string= "" i) collect i)))
- (if (consp (car history))
- (mapcar 'prin1-to-string history)
- history)))
- :migemo t
- :multiline t
- :action (lambda (candidate)
- (delete-minibuffer-contents)
- (insert candidate))))
-
-;;; Shell history
-;;
-;;
-(defun helm-comint-input-ring-action (candidate)
- "Default action for comint history."
- (with-helm-current-buffer
- (delete-region (comint-line-beginning-position) (point-max))
- (insert candidate)))
-
-(defvar helm-source-comint-input-ring
- '((name . "Comint history")
- (candidates . (lambda ()
- (with-helm-current-buffer
- (ring-elements comint-input-ring))))
- (action . helm-comint-input-ring-action))
- "Source that provide helm completion against `comint-input-ring'.")
-
-\f
-;;; Helm ratpoison UI
-;;
-;;
-(defvar helm-source-ratpoison-commands
- '((name . "Ratpoison Commands")
- (init . helm-ratpoison-commands-init)
- (candidates-in-buffer)
- (action ("Execute the command" . helm-ratpoison-commands-execute))
- (display-to-real . helm-ratpoison-commands-display-to-real)
- (candidate-number-limit)))
-
-(defun helm-ratpoison-commands-init ()
- (unless (helm-candidate-buffer)
- (with-current-buffer (helm-candidate-buffer 'global)
- ;; with ratpoison prefix key
- (save-excursion
- (call-process "ratpoison" nil (current-buffer) nil "-c" "help"))
- (while (re-search-forward "^\\([^ ]+\\) \\(.+\\)$" nil t)
- (replace-match "<ratpoison> \\1: \\2"))
- (goto-char (point-max))
- ;; direct binding
- (save-excursion
- (call-process "ratpoison" nil (current-buffer) nil "-c" "help top"))
- (while (re-search-forward "^\\([^ ]+\\) \\(.+\\)$" nil t)
- (replace-match "\\1: \\2")))))
-
-(defun helm-ratpoison-commands-display-to-real (display)
- (and (string-match ": " display)
- (substring display (match-end 0))))
-
-(defun helm-ratpoison-commands-execute (candidate)
- (call-process "ratpoison" nil nil nil "-ic" candidate))
-
-;;; Helm stumpwm UI
-;;
-;;
-(defvar helm-source-stumpwm-commands
- '((name . "Stumpwm Commands")
- (init . helm-stumpwm-commands-init)
- (candidates-in-buffer)
- (action ("Execute the command" . helm-stumpwm-commands-execute))
- (candidate-number-limit)))
-
-(defun helm-stumpwm-commands-init ()
- (with-current-buffer (helm-candidate-buffer 'global)
- (save-excursion
- (call-process "stumpish" nil (current-buffer) nil "commands"))
- (while (re-search-forward "[ ]*\\([^ ]+\\)[ ]*\n?" nil t)
- (replace-match "\n\\1\n"))
- (delete-blank-lines)
- (sort-lines nil (point-min) (point-max))
- (goto-char (point-max))))
-
-(defun helm-stumpwm-commands-execute (candidate)
- (call-process "stumpish" nil nil nil candidate))
-
-;;;###autoload
-(defun helm-world-time ()
- "Preconfigured `helm' to show world time.
-Default action change TZ environment variable locally to emacs."
- (interactive)
- (helm-other-buffer 'helm-source-time-world "*helm world time*"))
-
-;;;###autoload
-(defun helm-insert-latex-math ()
- "Preconfigured helm for latex math symbols completion."
- (interactive)
- (helm-other-buffer 'helm-source-latex-math "*helm latex*"))
-
-;;;###autoload
-(defun helm-ratpoison-commands ()
- "Preconfigured `helm' to execute ratpoison commands."
- (interactive)
- (helm-other-buffer 'helm-source-ratpoison-commands
- "*helm ratpoison commands*"))
-
-;;;###autoload
-(defun helm-stumpwm-commands()
- "Preconfigured helm for stumpwm commands."
- (interactive)
- (helm-other-buffer 'helm-source-stumpwm-commands
- "*helm stumpwm commands*"))
-
-;;;###autoload
-(defun helm-minibuffer-history ()
- "Preconfigured `helm' for `minibuffer-history'."
- (interactive)
- (let ((enable-recursive-minibuffers t))
- (helm :sources 'helm-source-minibuffer-history
- :buffer "*helm minibuffer-history*")))
-
-;;;###autoload
-(defun helm-comint-input-ring ()
- "Preconfigured `helm' that provide completion of `comint' history."
- (interactive)
- (when (derived-mode-p 'comint-mode)
- (helm :sources 'helm-source-comint-input-ring
- :input (buffer-substring-no-properties (comint-line-beginning-position)
- (point-at-eol))
- :buffer "*helm comint history*")))
-
-
-(provide 'helm-misc)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-misc.el ends here
+++ /dev/null
-;;; helm-mode.el --- Enable helm completion everywhere. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-files)
-
-\f
-(defgroup helm-mode nil
- "Enable helm completion."
- :group 'helm)
-
-(defcustom helm-completing-read-handlers-alist
- '((describe-function . helm-completing-read-symbols)
- (describe-variable . helm-completing-read-symbols)
- (describe-symbol . helm-completing-read-symbols)
- (debug-on-entry . helm-completing-read-symbols)
- (find-function . helm-completing-read-symbols)
- (disassemble . helm-completing-read-symbols)
- (trace-function . helm-completing-read-symbols)
- (trace-function-foreground . helm-completing-read-symbols)
- (trace-function-background . helm-completing-read-symbols)
- (find-tag . helm-completing-read-with-cands-in-buffer)
- (ffap-alternate-file . nil)
- (tmm-menubar . nil))
- "Alist of handlers to replace `completing-read', `read-file-name' in `helm-mode'.
-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 an helm function that take 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.
-This function prefix name must start by \"helm\".
-
-See `helm-completing-read-symbols' for example.
-
-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' complete against symbols and
-second `completing-read' should handle only buffer,
-your specialized function should handle the both.
-
-If the value of an entry is nil completion will fall back to
-emacs vanilla behavior.
-e.g If you want to disable helm completion for `describe-function':
-\(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.
-e.g 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."
- :group 'helm-mode
- :type '(alist :key-type symbol :value-type symbol))
-
-(defcustom helm-comp-read-case-fold-search helm-case-fold-search
- "Default Local setting of `helm-case-fold-search' for `helm-comp-read'.
-See `helm-case-fold-search' for more info."
- :group 'helm-mode
- :type 'symbol)
-
-(defcustom helm-mode-handle-completion-in-region t
- "Whether to replace or not `completion-in-region-function'.
-This enable support for `completing-read-multiple' and `completion-at-point'
-when non--nil."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-mode-reverse-history t
- "Display history source after current source in `helm-mode' handled commands."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-mode-no-completion-in-region-in-modes nil
- "A list of modes that do not want helm for `completion-in-region'."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-completion-in-region-fuzzy-match nil
- "Whether `helm-completion-in-region' use fuzzy matching or not.
-Affect among others `completion-at-point', `completing-read-multiple'."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-mode-fuzzy-match nil
- "Enable fuzzy matching in `helm-mode' globally.
-Note that this will slow down completion and modify sorting
-which is unwanted in many places.
-This affect only the functions with completing-read helmized by helm-mode.
-To fuzzy match `completion-at-point' and friends see
-`helm-completion-in-region-fuzzy-match'."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-mode-minibuffer-setup-hook-black-list '(minibuffer-completion-help)
- "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'."
- :group 'helm-mode
- :type '(repeat (choice symbol)))
-
-\f
-(defvar helm-comp-read-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "<C-return>") 'helm-cr-empty-string)
- (define-key map (kbd "<M-RET>") 'helm-cr-empty-string)
- map)
- "Keymap for `helm-comp-read'.")
-
-(defvar helm-comp-read-must-match-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "RET")
- 'helm-confirm-and-exit-minibuffer)
- map)
- "Keymap use as must-match-map in `helm-comp-read' and `helm-read-file-name'.")
-
-\f
-;;; Internal
-;;
-;;
-;; Flag to know if `helm-pattern' have been added
-;; to candidate list in `helm-comp-read'.
-(defvar helm-cr-unknown-pattern-flag nil)
-
-\f
-;;; Helm `completing-read' replacement
-;;
-;;
-(defun helm-cr-empty-string ()
- "Return empty string."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- (lambda (_candidate)
- (identity "")))))
-
-(defun helm-mode--keyboard-quit ()
- ;; Use this instead of `keyboard-quit'
- ;; to avoid deactivating mark in current-buffer.
- (let ((debug-on-quit nil))
- (signal 'quit nil)))
-
-(defun helm-comp-read-get-candidates (collection &optional test sort-fn alistp)
- "Convert COLLECTION to list removing elements that don't match TEST.
-See `helm-comp-read' about supported COLLECTION arguments.
-
-SORT-FN is a predicate to sort COLLECTION.
-
-ALISTP when non--nil will not use `all-completions' to collect
-candidates because it doesn't handle alists correctly for helm.
-i.e In `all-completions' the car of each pair is used as value.
-In helm we want to use the cdr instead like \(display . real\),
-so we return the alist as it is with no transformation by all-completions.
-
-e.g
-
-\(setq A '((a . 1) (b . 2) (c . 3)))
-==>((a . 1) (b . 2) (c . 3))
-\(helm-comp-read \"test: \" A :alistp nil
- :exec-when-only-one t
- :initial-input \"a\")
-==>\"a\" Which is not what we expect.
-
-\(helm-comp-read \"test: \" A :alistp t
- :exec-when-only-one t
- :initial-input \"1\")
-==>\"1\"
-
-See docstring of `all-completions' for more info.
-
-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) .
- (with-helm-current-buffer
- (let ((cands
- (cond ((vectorp collection)
- (all-completions "" collection test))
- ((and (symbolp collection) (boundp collection)
- ;; Issue #324 history is let-bounded and given
- ;; quoted as hist argument of completing-read.
- ;; See example in `rcirc-browse-url'.
- (symbolp (symbol-value collection)))
- nil)
- ;; When collection is a symbol, most of the time
- ;; it should be a symbol used as a minibuffer-history.
- ;; The value of this symbol in this case return a list
- ;; of string which maybe are converted later as symbol
- ;; in special cases.
- ;; we treat here commandp as a special case as it return t
- ;; also with a string unless its last arg is provided.
- ;; Also, the history collections generally collect their
- ;; elements as string, so intern them to call predicate.
- ((and (symbolp collection) (boundp collection) test)
- (let ((predicate `(lambda (elm)
- (condition-case err
- (if (eq (quote ,test) 'commandp)
- (funcall (quote ,test) (intern elm))
- (funcall (quote ,test) elm))
- (wrong-type-argument
- (funcall (quote ,test) (intern elm)))))))
- (all-completions "" (symbol-value collection) predicate)))
- ((and (symbolp collection) (boundp collection))
- (all-completions "" (symbol-value collection)))
- ;; Normally file completion should not be handled here,
- ;; but special cases like `find-file-at-point' do it.
- ;; Handle here specially such cases.
- ((and (functionp collection) minibuffer-completing-file-name)
- (cl-loop for f in (funcall collection helm-pattern test t)
- unless (member f '("./" "../"))
- if (string-match ffap-url-regexp helm-pattern)
- collect f
- else
- collect (concat (file-name-as-directory
- (helm-basedir helm-pattern)) f)))
- ((functionp collection)
- (funcall collection "" test t))
- ((and alistp test)
- (cl-loop for i in collection when (funcall test i) collect i))
- (alistp collection)
- (t (all-completions "" collection test)))))
- (if sort-fn (sort cands sort-fn) cands))))
-
-(defun helm-cr-default-transformer (candidates _source)
- "Default filter candidate function for `helm-comp-read'."
- (cl-loop for c in candidates
- for cand = (if (stringp c) (replace-regexp-in-string "\\s\\" "" c) c)
- for pat = (replace-regexp-in-string "\\s\\" "" helm-pattern)
- if (and (equal cand pat) helm-cr-unknown-pattern-flag)
- collect
- (cons (concat (propertize
- " " 'display
- (propertize "[?]" 'face 'helm-ff-prefix))
- c)
- c)
- into lst
- else collect (if (and (stringp c)
- (string-match "\n" c))
- (cons (replace-regexp-in-string "\n" "->" c) c)
- c)
- into lst
- finally return (helm-fast-remove-dups lst :test 'equal)))
-
-(defun helm-comp-read--move-to-first-real-candidate ()
- (helm-aif (helm-get-selection nil 'withprop)
- (when (string= (get-text-property 0 'display it) "[?]")
- (helm-next-line))))
-
-;;;###autoload
-(cl-defun helm-comp-read (prompt collection
- &key
- test
- initial-input
- default
- preselect
- (buffer "*Helm Completions*")
- must-match
- fuzzy
- reverse-history
- (requires-pattern 0)
- history
- input-history
- (case-fold helm-comp-read-case-fold-search)
- (del-input t)
- (persistent-action nil)
- (persistent-help "DoNothing")
- (mode-line helm-comp-read-mode-line)
- help-message
- (keymap helm-comp-read-map)
- (name "Helm Completions")
- candidates-in-buffer
- exec-when-only-one
- quit-when-no-cand
- (volatile t)
- sort
- (fc-transformer 'helm-cr-default-transformer)
- hist-fc-transformer
- marked-candidates
- nomark
- (alistp t)
- (candidate-number-limit helm-candidate-number-limit))
- "Read a string in the minibuffer, with helm completion.
-
-It is helm `completing-read' equivalent.
-
-- PROMPT is the prompt name to use.
-
-- COLLECTION can be a list, vector, obarray or hash-table.
- It can be also a function that receives three arguments:
- the values string, predicate and t. See `all-completions' for more details.
-
-Keys description:
-
-- TEST: A predicate called with one arg i.e candidate.
-
-- INITIAL-INPUT: Same as input arg in `helm'.
-
-- PRESELECT: See preselect arg of `helm'.
-
-- DEFAULT: This option is used only for compatibility with regular
- Emacs `completing-read' (Same as DEFAULT arg of `completing-read').
-
-- BUFFER: Name of helm-buffer.
-
-- MUST-MATCH: Candidate selected must be one of COLLECTION.
-
-- FUZZY: Enable fuzzy matching.
-
-- REVERSE-HISTORY: When non--nil display history source after current
- source completion.
-
-- REQUIRES-PATTERN: Same as helm attribute, default is 0.
-
-- HISTORY: A list containing specific history, default is nil.
- When it is non--nil, all elements of HISTORY are displayed in
- a special source before COLLECTION.
-
-- INPUT-HISTORY: A symbol. the minibuffer input history will be
- stored there, if nil or not provided, `minibuffer-history'
- will be used instead.
-
-- CASE-FOLD: Same as `helm-case-fold-search'.
-
-- DEL-INPUT: Boolean, when non--nil (default) remove the partial
- minibuffer input from HISTORY is present.
-
-- PERSISTENT-ACTION: A function called with one arg i.e candidate.
-
-- PERSISTENT-HELP: A string to document PERSISTENT-ACTION.
-
-- MODE-LINE: A string or list to display in mode line.
- Default is `helm-comp-read-mode-line'.
-
-- KEYMAP: A keymap to use in this `helm-comp-read'.
- (the keymap will be shared with history source)
-
-- NAME: The name related to this local source.
-
-- EXEC-WHEN-ONLY-ONE: Bound `helm-execute-action-at-once-if-one'
- to non--nil. (possibles values are t or nil).
-
-- VOLATILE: Use volatile attribute \(enabled by default\).
-
-- SORT: A predicate to give to `sort' e.g `string-lessp'
- Use this only on small data as it is ineficient.
- If you want to sort faster add a sort function to
- FC-TRANSFORMER.
- Note that FUZZY when enabled is already providing a sort function.
-
-- FC-TRANSFORMER: A `filtered-candidate-transformer' function
- or a list of functions.
-
-- HIST-FC-TRANSFORMER: A `filtered-candidate-transformer'
- function for the history source.
-
-- MARKED-CANDIDATES: If non--nil return candidate or marked candidates as a list.
-
-- NOMARK: When non--nil don't allow marking candidates.
-
-- ALISTP: \(default is non--nil\) 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.
- Argument VOLATILE have no effect when CANDIDATES-IN-BUFFER is non--nil.
-
-Any prefix args passed during `helm-comp-read' invocation will be recorded
-in `helm-current-prefix-arg', otherwise if prefix args were given before
-`helm-comp-read' invocation, the value of `current-prefix-arg' will be used.
-That's mean you can pass prefix args before or after calling a command
-that use `helm-comp-read' See `helm-M-x' for example."
-
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (let ((action-fn `(("Sole action (Identity)"
- . (lambda (candidate)
- (if ,marked-candidates
- (helm-marked-candidates)
- (identity candidate)))))))
- ;; Assume completion have been already required,
- ;; so always use 'confirm.
- (when (eq must-match 'confirm-after-completion)
- (setq must-match 'confirm))
- (let* ((minibuffer-completion-confirm must-match)
- (must-match-map (when must-match helm-comp-read-must-match-map))
- (loc-map (if must-match-map
- (make-composed-keymap
- must-match-map (or keymap helm-map))
- (or keymap helm-map)))
- (minibuffer-completion-predicate test)
- (minibuffer-completion-table collection)
- (helm-read-file-name-mode-line-string
- (replace-regexp-in-string "helm-maybe-exit-minibuffer"
- "helm-confirm-and-exit-minibuffer"
- helm-read-file-name-mode-line-string))
- (get-candidates (lambda ()
- (let ((cands (helm-comp-read-get-candidates
- collection test sort alistp)))
- (setq helm-cr-unknown-pattern-flag nil)
- (unless (or (eq must-match t)
- (string= helm-pattern "")
- (assoc helm-pattern cands)
- (assoc (intern helm-pattern) cands)
- (member helm-pattern cands)
- (member (downcase helm-pattern) cands)
- (member (upcase helm-pattern) cands))
- (setq cands (append (list
- ;; Unquote helm-pattern
- ;; when it is added
- ;; as candidate.
- (replace-regexp-in-string
- "\\s\\" "" helm-pattern))
- cands))
- (setq helm-cr-unknown-pattern-flag t))
- ;; When DEFAULT is initially a list, candidates
- ;; come already computed with DEFAULT list appended,
- ;; and DEFAULT is set to the car of this list.
- (if (and default (not (string= default "")))
- (delq nil (cons default (delete default cands)))
- cands))))
- (history-get-candidates (lambda ()
- (let ((all (helm-comp-read-get-candidates
- history test nil alistp)))
- (when all
- (delete
- ""
- (helm-fast-remove-dups
- (if (and default (not (string= default "")))
- (delq nil (cons default
- (delete default all)))
- all)
- :test 'equal))))))
- (src-hist (helm-build-sync-source (format "%s History" name)
- :candidates history-get-candidates
- :fuzzy-match fuzzy
- :filtered-candidate-transformer
- (append '((lambda (candidates sources)
- (cl-loop for i in candidates
- ;; Input is added to history in completing-read's
- ;; and may be regexp-quoted, so unquote it.
- for cand = (replace-regexp-in-string "\\s\\" "" i)
- collect cand)))
- (and hist-fc-transformer (helm-mklist hist-fc-transformer)))
- :persistent-action persistent-action
- :persistent-help persistent-help
- :mode-line mode-line
- :help-message help-message
- :action action-fn))
- (src (helm-build-sync-source name
- :candidates get-candidates
- :filtered-candidate-transformer fc-transformer
- :requires-pattern requires-pattern
- :persistent-action persistent-action
- :persistent-help persistent-help
- :fuzzy-match fuzzy
- :mode-line mode-line
- :help-message help-message
- :action action-fn))
- (src-1 (helm-build-in-buffer-source name
- :data get-candidates
- :filtered-candidate-transformer fc-transformer
- :requires-pattern requires-pattern
- :persistent-action persistent-action
- :fuzzy-match fuzzy
- :persistent-help persistent-help
- :mode-line mode-line
- :help-message help-message
- :action action-fn))
- (src-list (list src-hist
- (if candidates-in-buffer
- src-1
- (if volatile
- (append src '((volatile)))
- src))))
- (helm-execute-action-at-once-if-one exec-when-only-one)
- (helm-quit-if-no-candidate quit-when-no-cand)
- result)
- (when nomark
- (setq src-list (cl-loop for src in src-list
- collect (cons '(nomark) src))))
- (when reverse-history (setq src-list (nreverse src-list)))
- (add-hook 'helm-after-update-hook 'helm-comp-read--move-to-first-real-candidate)
- (unwind-protect
- (setq result (helm
- :sources src-list
- :input initial-input
- :default default
- :preselect preselect
- :prompt prompt
- :resume 'noresume
- :candidate-number-limit candidate-number-limit
- :case-fold-search case-fold
- :keymap loc-map
- :history (and (symbolp input-history) input-history)
- :buffer buffer))
- (remove-hook 'helm-after-update-hook 'helm-comp-read--move-to-first-real-candidate))
- ;; 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.
- ;; 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.
- (setcar history result))
- (t ; Possibly a symbol with a nil value.
- (set history (list result)))))
- (or
- result
- (when (and (eq helm-exit-status 0)
- (eq must-match 'confirm))
- ;; Return empty string only if it is the DEFAULT
- ;; value and helm-pattern is empty.
- ;; otherwise return helm-pattern
- (if (and (string= helm-pattern "") default)
- default (identity helm-pattern)))
- (unless (or (eq helm-exit-status 1)
- must-match) ; FIXME this should not be needed now.
- default)
- (helm-mode--keyboard-quit)))))
-
-;; Generic completing-read
-;;
-;; Support also function as collection.
-;; e.g M-x man is supported.
-;; Support hash-table and vectors as collection.
-;; NOTE:
-;; Some crap emacs functions may not be supported
-;; like ffap-alternate-file (bad use of completing-read)
-;; and maybe others.
-;; Provide a mode `helm-mode' which turn on
-;; helm in all `completing-read' and `read-file-name' in Emacs.
-;;
-(defvar helm-completion-mode-string " Helm")
-
-(defvar helm-completion-mode-quit-message
- "Helm completion disabled")
-
-(defvar helm-completion-mode-start-message
- "Helm completion enabled")
-
-;;; Specialized handlers
-;;
-;;
-(defun helm-completing-read-symbols
- (prompt _collection test _require-match init
- hist default _inherit-input-method name buffer)
- "Specialized function for fast symbols completion in `helm-mode'."
- (require 'helm-elisp)
- (or
- (helm
- :sources (helm-build-in-buffer-source name
- :init (lambda ()
- (helm-apropos-init (lambda (x)
- (and (funcall test x)
- (not (keywordp x))))
- (or (car-safe default) default)))
- :filtered-candidate-transformer 'helm-apropos-default-sort-fn
- :fuzzy-match helm-mode-fuzzy-match
- :persistent-action
- (lambda (candidate)
- (helm-lisp-completion-persistent-action
- candidate name))
- :persistent-help (helm-lisp-completion-persistent-help))
- :prompt prompt
- :buffer buffer
- :input init
- :history hist
- :resume 'noresume
- :default (or default ""))
- (helm-mode--keyboard-quit)))
-
-
-;;; Generic completing read
-;;
-;;
-(defun helm-completing-read-default-1
- (prompt collection test require-match
- init hist default _inherit-input-method
- name buffer &optional cands-in-buffer exec-when-only-one)
- "Call `helm-comp-read' with same args as `completing-read'.
-Extra optional arg CANDS-IN-BUFFER mean use `candidates-in-buffer'
-method which is faster.
-It should be used when candidate list don't need to rebuild dynamically."
- (let ((history (or (car-safe hist) hist))
- (alistp cands-in-buffer))
- (when (and default (listp default))
- ;; When DEFAULT is a list move the list on head of COLLECTION
- ;; and set it to its car. #bugfix `grep-read-files'.
- (setq collection
- ;; COLLECTION is maybe a function or a table.
- (append default
- (helm-comp-read-get-candidates
- collection test nil (listp collection))))
- ;; Ensure `all-completions' will not be used
- ;; a second time to recompute COLLECTION [1].
- (setq alistp t)
- (setq default (car default)))
- (helm-comp-read
- prompt collection
- :test test
- :history history
- :reverse-history helm-mode-reverse-history
- :input-history history
- :must-match require-match
- :alistp alistp ; Ensure `all-completions' is used when non-nil [1].
- :name name
- :requires-pattern (if (and (string= default "")
- (or (eq require-match 'confirm)
- (eq require-match
- 'confirm-after-completion)))
- 1 0)
- :candidates-in-buffer cands-in-buffer
- :exec-when-only-one exec-when-only-one
- :fuzzy helm-mode-fuzzy-match
- :buffer buffer
- ;; If DEF is not provided, fallback to empty string
- ;; to avoid `thing-at-point' to be appended on top of list
- :default (or default "")
- ;; Fail with special characters (e.g in gnus "nnimap+gmail:")
- ;; if regexp-quote is not used.
- ;; when init is added to history, it will be unquoted by
- ;; helm-comp-read.
- :initial-input (helm-aif (pcase init
- ((pred (stringp)) init)
- ;; INIT is a cons cell.
- (`(,l . ,_ll) l))
- (if minibuffer-completing-file-name it
- (regexp-quote it))))))
-
-(defun helm-completing-read-with-cands-in-buffer
- (prompt collection test require-match
- init hist default inherit-input-method
- name buffer)
- "Same as `helm-completing-read-default-1' but use candidates-in-buffer."
- ;; Some commands like find-tag may use `read-file-name' from inside
- ;; the calculation of collection. in this case it clash with
- ;; candidates-in-buffer that reuse precedent data (files) which is wrong.
- ;; So (re)calculate collection outside of main helm-session.
- (let ((cands (all-completions "" collection)))
- (helm-completing-read-default-1 prompt cands test require-match
- init hist default inherit-input-method
- name buffer t)))
-
-(cl-defun helm--completing-read-default
- (prompt collection &optional
- predicate require-match
- initial-input hist def
- inherit-input-method)
- "An helm replacement of `completing-read'.
-This function should be used only as a `completing-read-function'.
-
-Don't use it directly, use instead `helm-comp-read' in your programs.
-
-See documentation of `completing-read' and `all-completions' for details."
- (let* ((current-command (or (helm-this-command) this-command))
- (str-command (helm-symbol-name current-command))
- (buf-name (format "*helm-mode-%s*" str-command))
- (entry (assq current-command
- helm-completing-read-handlers-alist))
- (def-com (cdr-safe entry))
- (str-defcom (and def-com (helm-symbol-name def-com)))
- (def-args (list prompt collection predicate require-match
- initial-input hist def inherit-input-method))
- ;; Append the two extra args needed to set the buffer and source name
- ;; in helm specialized functions.
- (any-args (append def-args (list str-command buf-name)))
- helm-completion-mode-start-message ; Be quiet
- helm-completion-mode-quit-message
- ;; Be sure this pesty *completion* buffer doesn't popup.
- ;; 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.
- ;; 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).
- ;; otherwise helm have not the time to close its initial session.
- (minibuffer-setup-hook
- (cl-loop for h in minibuffer-setup-hook
- unless (or (consp h) ; a lambda.
- (byte-code-function-p h)
- (memq h helm-mode-minibuffer-setup-hook-black-list))
- collect h))
- ;; Disable hack that could be used before `completing-read'.
- ;; i.e (push ?\t unread-command-events).
- unread-command-events)
- (when (eq def-com 'ido) (setq def-com 'ido-completing-read))
- (unless (or (not entry) def-com)
- ;; An entry in *read-handlers-alist exists but have
- ;; a nil value, so we exit from here, disable `helm-mode'
- ;; and run the command again with it original behavior.
- ;; `helm-mode' will be restored on exit.
- (cl-return-from helm--completing-read-default
- (unwind-protect
- (progn
- (helm-mode -1)
- (apply completing-read-function def-args))
- (helm-mode 1))))
- ;; If we use now `completing-read' we MUST turn off `helm-mode'
- ;; to avoid infinite recursion and CRASH. It will be reenabled on exit.
- (when (or (eq def-com 'completing-read)
- ;; All specialized functions are prefixed by "helm"
- (and (stringp str-defcom)
- (not (string-match "^helm" str-defcom))))
- (helm-mode -1))
- (unwind-protect
- (cond (;; An helm specialized function exists, run it.
- (and def-com helm-mode)
- (apply def-com any-args))
- (;; Try to handle `ido-completing-read' everywhere.
- (and def-com (eq def-com 'ido-completing-read))
- (setcar (memq collection def-args)
- (all-completions "" collection predicate))
- (apply def-com def-args))
- (;; User set explicitely `completing-read' or something similar
- ;; in *read-handlers-alist, use this with exactly the same
- ;; args as in `completing-read'.
- ;; If we are here `helm-mode' is now disabled.
- def-com
- (apply def-com def-args))
- (t ; Fall back to classic `helm-comp-read'.
- (helm-completing-read-default-1
- prompt collection predicate require-match
- initial-input hist def inherit-input-method
- str-command buf-name)))
- (helm-mode 1)
- ;; When exiting minibuffer, `this-command' is set to
- ;; `helm-exit-minibuffer', which is unwanted when starting
- ;; on another `completing-read', so restore `this-command' to
- ;; initial value when exiting.
- (setq this-command current-command))))
-\f
-;;; Generic read-file-name
-;;
-;;
-;;;###autoload
-(cl-defun helm-read-file-name
- (prompt
- &key
- (name "Read File Name")
- (initial-input default-directory)
- (buffer "*Helm file completions*")
- test
- (case-fold helm-file-name-case-fold-search)
- preselect
- history
- must-match
- default
- marked-candidates
- (candidate-number-limit helm-ff-candidate-number-limit)
- nomark
- (alistp t)
- (persistent-action 'helm-find-files-persistent-action)
- (persistent-help "Hit1 Expand Candidate, Hit2 or (C-u) Find file")
- (mode-line helm-read-file-name-mode-line-string))
- "Read a file name with helm completion.
-It is helm `read-file-name' emulation.
-
-Argument PROMPT is the default prompt to use.
-
-Keys description:
-
-- NAME: Source name, default to \"Read File Name\".
-
-- INITIAL-INPUT: Where to start read file name, default to `default-directory'.
-
-- BUFFER: `helm-buffer' name default to \"*Helm Completions*\".
-
-- TEST: A predicate called with one arg 'candidate'.
-
-- CASE-FOLD: Same as `helm-case-fold-search'.
-
-- PRESELECT: helm preselection.
-
-- HISTORY: Display HISTORY in a special source.
-
-- MUST-MATCH: Can be 'confirm, nil, or t.
-
-- MARKED-CANDIDATES: When non--nil return a list of marked candidates.
-
-- NOMARK: When non--nil don't allow marking candidates.
-
-- ALISTP: Don't use `all-completions' in history (take effect only on history).
-
-- PERSISTENT-ACTION: a persistent action function.
-
-- PERSISTENT-HELP: persistent help message.
-
-- MODE-LINE: A mode line message, default is `helm-read-file-name-mode-line-string'."
-
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- ;; Assume completion have been already required,
- ;; so always use 'confirm.
- (when (eq must-match 'confirm-after-completion)
- (setq must-match 'confirm))
- (let* ((action-fn `(("Sole action (Identity)"
- . (lambda (candidate)
- (if ,marked-candidates
- (helm-marked-candidates :with-wildcard t)
- (identity candidate))))))
- ;; Be sure we don't erase the underlying minibuffer if some.
- (helm-ff-auto-update-initial-value
- (and helm-ff-auto-update-initial-value
- (not (minibuffer-window-active-p (minibuffer-window)))))
- helm-full-frame
- (hist (and history (helm-comp-read-get-candidates
- history nil nil alistp)))
- (minibuffer-completion-confirm must-match)
- (must-match-map (when must-match helm-comp-read-must-match-map))
- (cmap (if must-match-map
- (make-composed-keymap
- must-match-map helm-read-file-map)
- helm-read-file-map))
- (minibuffer-completion-predicate test)
- (minibuffer-completing-file-name t)
- (helm-read-file-name-mode-line-string
- (replace-regexp-in-string "helm-maybe-exit-minibuffer"
- "helm-confirm-and-exit-minibuffer"
- helm-read-file-name-mode-line-string))
- (src-list
- (list
- ;; History source.
- (helm-build-sync-source (format "%s History" name)
- :header-name (lambda (name)
- (concat name (substitute-command-keys
- helm-find-files-doc-header)))
- :mode-line mode-line
- :candidates hist
- :nohighlight t
- :persistent-action persistent-action
- :persistent-help persistent-help
- :nomark nomark
- :action action-fn)
- ;; Other source.
- (helm-build-sync-source name
- :header-name (lambda (name)
- (concat name (substitute-command-keys
- helm-find-files-doc-header)))
- :init (lambda ()
- (setq helm-ff-auto-update-flag
- helm-ff-auto-update-initial-value)
- (setq helm-ff--auto-update-state
- helm-ff-auto-update-flag))
- :mode-line mode-line
- :help-message 'helm-read-file-name-help-message
- :nohighlight t
- :candidates
- (lambda ()
- (append (and (not (file-exists-p helm-pattern))
- (list helm-pattern))
- (if test
- (cl-loop with hn = (helm-ff-tramp-hostnames)
- for i in (helm-find-files-get-candidates
- must-match)
- when (or (member i hn) ; A tramp host
- (funcall test i)) ; Test ok
- collect i)
- (helm-find-files-get-candidates must-match))))
- :filtered-candidate-transformer 'helm-ff-sort-candidates
- :filter-one-by-one 'helm-ff-filter-candidate-one-by-one
- :persistent-action persistent-action
- :persistent-help persistent-help
- :volatile t
- :nomark nomark
- :action action-fn)))
- ;; Helm result.
- (result (helm
- :sources src-list
- :input (expand-file-name initial-input)
- :prompt prompt
- :keymap cmap
- :candidate-number-limit candidate-number-limit
- :resume 'noresume
- :case-fold-search case-fold
- :default default
- :buffer buffer
- :preselect preselect)))
- (or
- (cond ((and result (stringp result)
- (string= result "") ""))
- ((and result
- (stringp result)
- (file-equal-p result initial-input)
- default)
- (if (listp default) (car default) default))
- ((and result (stringp result))
- (expand-file-name result))
- ((and result (listp result))
- (mapcar #'expand-file-name result))
- (t result))
- (when (and (not (string= helm-pattern ""))
- (eq helm-exit-status 0)
- (eq must-match 'confirm))
- (identity helm-pattern))
- (helm-mode--keyboard-quit))))
-
-(defun helm-mode--default-filename (fname dir initial)
- (unless dir (setq dir default-directory))
- (unless (file-name-absolute-p dir)
- (setq dir (expand-file-name dir)))
- (unless (or fname (consp fname))
- (setq fname (expand-file-name
- (or initial buffer-file-name dir)
- dir)))
- (if (and fname (consp fname))
- (setq fname (cl-loop for f in fname
- collect (expand-file-name f dir)))
- (if (file-name-absolute-p fname)
- fname (expand-file-name fname dir))))
-
-(cl-defun helm--generic-read-file-name
- (prompt &optional dir default-filename mustmatch initial predicate)
- "Generic helm replacement of `read-file-name'.
-Don't use it directly, use instead `helm-read-file-name' in your programs."
- (let* ((init (or initial dir default-directory))
- (current-command (or (helm-this-command) this-command))
- (str-command (helm-symbol-name current-command))
- (helm--file-completion-sources
- (cons str-command
- (remove str-command helm--file-completion-sources)))
- (buf-name (format "*helm-mode-%s*" str-command))
- (entry (assq current-command
- helm-completing-read-handlers-alist))
- (def-com (cdr-safe entry))
- (str-defcom (and def-com (helm-symbol-name def-com)))
- (def-args (list prompt dir default-filename mustmatch initial predicate))
- ;; Append the two extra args needed to set the buffer and source name
- ;; in helm specialized functions.
- (any-args (append def-args (list str-command buf-name)))
- (ido-state ido-mode)
- helm-completion-mode-start-message ; Be quiet
- helm-completion-mode-quit-message ; Same here
- fname)
- (setq default-filename (helm-mode--default-filename
- default-filename dir initial))
- ;; Some functions that normally call `completing-read' can switch
- ;; brutally to `read-file-name' (e.g find-tag), in this case
- ;; the helm specialized function will fail because it is build
- ;; for `completing-read', so set it to 'incompatible to be sure
- ;; we switch to `helm-read-file-name' and don't try to call it
- ;; with wrong number of args.
- (when (eq def-com 'ido)
- (setq def-com 'ido-read-file-name) (ido-mode 1))
- (when (and def-com (> (length (help-function-arglist def-com)) 8))
- (setq def-com 'incompatible))
- (unless (or (not entry) def-com)
- (cl-return-from helm--generic-read-file-name
- (unwind-protect
- (progn
- (helm-mode -1)
- (apply read-file-name-function def-args))
- (helm-mode 1))))
- ;; If we use now `read-file-name' we MUST turn off `helm-mode'
- ;; to avoid infinite recursion and CRASH. It will be reenabled on exit.
- (when (or (eq def-com 'read-file-name)
- (eq def-com 'ido-read-file-name)
- (and (stringp str-defcom)
- (not (string-match "^helm" str-defcom))))
- (helm-mode -1))
- (unwind-protect
- (setq fname
- (cond (;; A specialized function exists, run it
- ;; with the two extra args specific to helm..
- (and def-com helm-mode
- (not (eq def-com 'ido-read-file-name))
- (not (eq def-com 'incompatible)))
- (apply def-com any-args))
- (;; Def-com value is `ido-read-file-name'
- ;; run it with default args.
- (and def-com (eq def-com 'ido-read-file-name))
- (ido-mode 1)
- (apply def-com def-args))
- (;; Def-com value is `read-file-name'
- ;; run it with default args.
- (eq def-com 'read-file-name)
- (apply def-com def-args))
- (t ; Fall back to classic `helm-read-file-name'.
- (helm-read-file-name
- prompt
- :name str-command
- :buffer buf-name
- :default default-filename
- :initial-input (expand-file-name init dir)
- :alistp nil
- :must-match mustmatch
- :test predicate))))
- (helm-mode 1)
- (ido-mode (if ido-state 1 -1))
- ;; Same comment as in `helm--completing-read-default'.
- (setq this-command current-command))
- (if (eq predicate 'file-directory-p) ; Using `read-directory-name'.
- (file-name-as-directory fname) fname)))
-
-(defun helm-mode--advice-lisp--local-variables (old--fn &rest args)
- (ignore-errors
- (apply old--fn args)))
-
-(defun helm--completion-in-region (start end collection &optional predicate)
- "Helm replacement of `completion--in-region'.
-Can be used as value for `completion-in-region-function'."
- (cl-declare (special require-match prompt))
- (if (memq major-mode helm-mode-no-completion-in-region-in-modes)
- (funcall helm--old-completion-in-region-function
- start end collection predicate)
- (advice-add
- 'lisp--local-variables
- :around #'helm-mode--advice-lisp--local-variables)
- (unwind-protect
- (let* ((enable-recursive-minibuffers t)
- (input (buffer-substring-no-properties start end))
- (current-command (or (helm-this-command) this-command))
- (str-command (helm-symbol-name current-command))
- (buf-name (format "*helm-mode-%s*" str-command))
- (require-match (or (and (boundp 'require-match) require-match)
- minibuffer-completion-confirm
- ;; If prompt have not been propagated here, that's
- ;; probably mean we have no prompt and we are in
- ;; completion-at-point or friend, so use a non--nil
- ;; value for require-match.
- (not (boundp 'prompt))))
- ;; `completion-extra-properties' is let-bounded in `completion-at-point'.
- ;; `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.
- (afun (plist-get completion-extra-properties :annotation-function))
- (data (all-completions input collection predicate))
- (init-space-suffix (unless (or helm-completion-in-region-fuzzy-match
- (string-suffix-p " " input))
- " "))
- ;; Assume that when `afun' and `predicate' are null
- ;; we are in filename completion.
- (file-comp-p (or (helm-mode--in-file-completion-p)
- (and (null afun) (null predicate))))
- ;; Completion-at-point and friends have no prompt.
- (result (if (stringp data)
- data
- (helm-comp-read
- (or (and (boundp 'prompt) prompt) "Pattern: ")
- (if file-comp-p
- (cl-loop for f in data unless
- (string-match "\\`\\.\\{1,2\\}/\\'" f)
- collect f)
- (if afun
- (mapcar (lambda (s)
- (let ((ann (funcall afun s)))
- (if ann
- (cons
- (concat
- s
- (propertize
- " " 'display
- (propertize
- ann
- 'face 'completions-annotations)))
- s)
- s)))
- data)
- data))
- :name str-command
- :fuzzy helm-completion-in-region-fuzzy-match
- :nomark t
- :initial-input
- (cond ((and file-comp-p
- (not (string-match "/\\'" input)))
- (concat (helm-basename input)
- (unless (string= input "")
- init-space-suffix)))
- ((string-match "/\\'" input) nil)
- ((or (null require-match)
- (stringp require-match))
- input)
- (t (concat input init-space-suffix)))
- :buffer buf-name
- :fc-transformer (append (list 'helm-cr-default-transformer)
- (list (lambda (candidates _source)
- (sort candidates 'helm-generic-sort-fn))))
- :exec-when-only-one t
- :quit-when-no-cand
- (lambda ()
- ;; Delay message to overwrite "Quit".
- (run-with-timer
- 0.01 nil
- (lambda ()
- (message "[No matches]")))
- t) ; exit minibuffer immediately.
- :must-match require-match))))
- (when result
- (delete-region (if (and file-comp-p
- (save-excursion
- (re-search-backward "~?/" start t)))
- (match-end 0) start)
- end)
- (insert result)))
- (advice-remove 'lisp--local-variables
- #'helm-mode--advice-lisp--local-variables))))
-
-(defun helm-mode--in-file-completion-p ()
- (with-helm-current-buffer
- (run-hook-with-args-until-success 'file-name-at-point-functions)))
-
-(when (boundp 'completion-in-region-function)
- (defconst helm--old-completion-in-region-function completion-in-region-function))
-
-;;;###autoload
-(define-minor-mode helm-mode
- "Toggle generic helm completion.
-
-All functions in Emacs that use `completing-read'
-or `read-file-name' 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 turn it on with `helm-mode'.
-
-Some crap emacs functions may not be supported,
-e.g `ffap-alternate-file' and maybe others
-You can add such functions to `helm-completing-read-handlers-alist'
-with a nil value.
-
-Note: This mode is incompatible with Emacs23."
- :group 'helm-mode
- :global t
- :lighter helm-completion-mode-string
- (cl-assert (boundp 'completing-read-function) nil
- "`helm-mode' not available, upgrade to Emacs-24")
- (if helm-mode
- (if (fboundp 'add-function)
- (progn
- (add-function :override completing-read-function
- #'helm--completing-read-default)
- (add-function :override read-file-name-function
- #'helm--generic-read-file-name)
- (when helm-mode-handle-completion-in-region
- (add-function :override completion-in-region-function
- #'helm--completion-in-region)))
- (setq completing-read-function 'helm--completing-read-default
- read-file-name-function 'helm--generic-read-file-name)
- (when (and (boundp 'completion-in-region-function)
- helm-mode-handle-completion-in-region)
- (setq completion-in-region-function #'helm--completion-in-region))
- (message helm-completion-mode-start-message))
- (if (fboundp 'remove-function)
- (progn
- (remove-function completing-read-function #'helm--completing-read-default)
- (remove-function read-file-name-function #'helm--generic-read-file-name)
- (remove-function completion-in-region-function #'helm--completion-in-region))
- (setq completing-read-function (and (fboundp 'completing-read-default)
- 'completing-read-default)
- read-file-name-function (and (fboundp 'read-file-name-default)
- 'read-file-name-default))
- (when (and (boundp 'completion-in-region-function)
- (boundp 'helm--old-completion-in-region-function))
- (setq completion-in-region-function helm--old-completion-in-region-function))
- (message helm-completion-mode-quit-message))))
-
-(provide 'helm-mode)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-mode.el ends here
+++ /dev/null
-;;; helm-multi-match.el --- Multiple regexp matching methods for helm -*- lexical-binding: t -*-
-
-;; Original Author: rubikitch
-
-;; Copyright (C) 2008 ~ 2011 rubikitch
-;; Copyright (C) 2011 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.com>
-
-;; Author: Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.com>
-;; URL: http://github.com/emacs-helm/helm
-
-;; 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 'cl-lib)
-(require 'helm-lib)
-
-\f
-(defgroup helm-multi-match nil
- "Helm multi match."
- :group 'helm)
-
-(defcustom helm-mm-matching-method '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."
- :type '(radio :tag "Matching methods for helm"
- (const :tag "Multiple regexp 1 ordered with prefix match" multi1)
- (const :tag "Multiple regexp 2 ordered with partial match" multi2)
- (const :tag "Multiple regexp 3 matching no order, partial, best." multi3)
- (const :tag "Multiple regexp 3p matching with prefix match" multi3p))
- :group 'helm-multi-match)
-
-\f
-;; Internal
-(defconst helm-mm-default-match-functions
- '(helm-mm-exact-match helm-mm-match))
-(defconst helm-mm-default-search-functions
- '(helm-mm-exact-search helm-mm-search))
-
-\f
-;;; Build regexps
-;;
-;;
-(defvar helm-mm-space-regexp "[\\ ] "
- "Regexp to represent space itself in multiple regexp match.")
-
-(defun helm-mm-split-pattern (pattern)
- "Split PATTERN if it contain spaces and return resulting list.
-If spaces in PATTERN are escaped, don't split at this place.
-i.e \"foo bar\"=> (\"foo\" \"bar\")
-but \"foo\ bar\"=> (\"foobar\")."
- (if (string= pattern "")
- '("")
- (cl-loop for s in (split-string
- (replace-regexp-in-string helm-mm-space-regexp
- "\000\000" pattern)
- " " t)
- collect (replace-regexp-in-string "\000\000" " " s))))
-
-(defun helm-mm-1-make-regexp (pattern)
- "Replace spaces in PATTERN with \"\.*\"."
- (mapconcat 'identity (helm-mm-split-pattern pattern) ".*"))
-
-\f
-;;; Exact match.
-;;
-;;
-;; Internal.
-(defvar helm-mm-exact-pattern-str nil)
-(defvar helm-mm-exact-pattern-real nil)
-
-(defun helm-mm-exact-get-pattern (pattern)
- (unless (equal pattern helm-mm-exact-pattern-str)
- (setq helm-mm-exact-pattern-str pattern
- helm-mm-exact-pattern-real (concat "\n" pattern "\n")))
- helm-mm-exact-pattern-real)
-
-
-(cl-defun helm-mm-exact-match (str &optional (pattern helm-pattern))
- (if case-fold-search
- (progn
- (setq str (downcase str)
- pattern (downcase pattern))
- (string= str pattern))
- (string= str pattern)))
-
-(defun helm-mm-exact-search (pattern &rest _ignore)
- (and (search-forward (helm-mm-exact-get-pattern pattern) nil t)
- (forward-line -1)))
-
-\f
-;;; Prefix match
-;;
-;;
-;; Internal
-(defvar helm-mm-prefix-pattern-str nil)
-(defvar helm-mm-prefix-pattern-real nil)
-
-(defun helm-mm-prefix-get-pattern (pattern)
- (unless (equal pattern helm-mm-prefix-pattern-str)
- (setq helm-mm-prefix-pattern-str pattern
- helm-mm-prefix-pattern-real (concat "\n" pattern)))
- helm-mm-prefix-pattern-real)
-
-(defun helm-mm-prefix-match (str &optional pattern)
- ;; In filename completion basename and basedir may be
- ;; quoted, unquote them for string comparison (Issue #1283).
- (setq pattern (replace-regexp-in-string
- "\\\\" "" (or pattern helm-pattern)))
- (let ((len (length pattern)))
- (and (<= len (length str))
- (string= (substring str 0 len) pattern ))))
-
-(defun helm-mm-prefix-search (pattern &rest _ignore)
- (search-forward (helm-mm-prefix-get-pattern pattern) nil t))
-
-\f
-;;; Multiple regexp patterns 1 (order is preserved / prefix).
-;;
-;;
-;; Internal
-(defvar helm-mm-1-pattern-str nil)
-(defvar helm-mm-1-pattern-real nil)
-
-(defun helm-mm-1-get-pattern (pattern)
- (unless (equal pattern helm-mm-1-pattern-str)
- (setq helm-mm-1-pattern-str pattern
- helm-mm-1-pattern-real
- (concat "^" (helm-mm-1-make-regexp pattern))))
- helm-mm-1-pattern-real)
-
-(cl-defun helm-mm-1-match (str &optional (pattern helm-pattern))
- (string-match (helm-mm-1-get-pattern pattern) str))
-
-(defun helm-mm-1-search (pattern &rest _ignore)
- (re-search-forward (helm-mm-1-get-pattern pattern) nil t))
-
-\f
-;;; Multiple regexp patterns 2 (order is preserved / partial).
-;;
-;;
-;; Internal
-(defvar helm-mm-2-pattern-str nil)
-(defvar helm-mm-2-pattern-real nil)
-
-(defun helm-mm-2-get-pattern (pattern)
- (unless (equal pattern helm-mm-2-pattern-str)
- (setq helm-mm-2-pattern-str pattern
- helm-mm-2-pattern-real
- (concat "^.*" (helm-mm-1-make-regexp pattern))))
- helm-mm-2-pattern-real)
-
-(cl-defun helm-mm-2-match (str &optional (pattern helm-pattern))
- (string-match (helm-mm-2-get-pattern pattern) str))
-
-(defun helm-mm-2-search (pattern &rest _ignore)
- (re-search-forward (helm-mm-2-get-pattern pattern) nil t))
-
-\f
-;;; Multiple regexp patterns 3 (permutation).
-;;
-;;
-;; Internal
-(defvar helm-mm-3-pattern-str nil)
-(defvar helm-mm-3-pattern-list nil)
-
-(defun helm-mm-3-get-patterns (pattern)
- "Return `helm-mm-3-pattern-list', a list of predicate/regexp cons cells.
-e.g ((identity . \"foo\") (identity . \"bar\")).
-This is done only if `helm-mm-3-pattern-str' is same as PATTERN."
- (unless (equal pattern helm-mm-3-pattern-str)
- (setq helm-mm-3-pattern-str pattern
- helm-mm-3-pattern-list
- (helm-mm-3-get-patterns-internal pattern)))
- helm-mm-3-pattern-list)
-
-(defun helm-mm-3-get-patterns-internal (pattern)
- "Return a list of predicate/regexp cons cells.
-e.g ((identity . \"foo\") (identity . \"bar\"))."
- (unless (string= pattern "")
- (cl-loop for pat in (helm-mm-split-pattern pattern)
- collect (if (string= "!" (substring pat 0 1))
- (cons 'not (substring pat 1))
- (cons 'identity pat)))))
-
-(cl-defun helm-mm-3-match (str &optional (pattern helm-pattern))
- "Check if PATTERN match STR.
-When PATTERN contain a space, it is splitted and matching is done
-with the several resulting regexps against STR.
-e.g \"bar foo\" will match \"foobar\" and \"barfoo\".
-Argument PATTERN, a string, is transformed in a list of
-cons cell with `helm-mm-3-get-patterns' if it contain a space.
-e.g \"foo bar\"=>((identity . \"foo\") (identity . \"bar\")).
-Then each predicate of cons cell(s) is called with regexp of same
-cons cell against STR (a candidate).
-i.e (identity (string-match \"foo\" \"foo bar\")) => t."
- (let ((pat (helm-mm-3-get-patterns pattern)))
- (cl-loop for (predicate . regexp) in pat
- always (funcall predicate
- (condition-case _err
- ;; FIXME: Probably do nothing when
- ;; using fuzzy leaving the job
- ;; to the fuzzy fn.
- (string-match regexp str)
- (invalid-regexp nil))))))
-
-(defun helm-mm-3-search-base (pattern searchfn1 searchfn2)
- "Try to find PATTERN in `helm-buffer' with SEARCHFN1 and SEARCHFN2.
-This is the search function for `candidates-in-buffer' enabled sources.
-Use the same method as `helm-mm-3-match' except it search in buffer
-instead of matching on a string.
-i.e (identity (re-search-forward \"foo\" (point-at-eol) t)) => t."
- (cl-loop with pat = (if (stringp pattern)
- (helm-mm-3-get-patterns pattern)
- pattern)
- when (eq (caar pat) 'not) return
- ;; Pass the job to `helm-search-match-part'.
- (prog1 (list (point-at-bol) (point-at-eol))
- (forward-line 1))
- while (condition-case _err
- (funcall searchfn1 (or (cdar pat) "") nil t)
- (invalid-regexp nil))
- for bol = (point-at-bol)
- for eol = (point-at-eol)
- if (cl-loop for (pred . str) in (cdr pat) always
- (progn (goto-char bol)
- (funcall pred (condition-case _err
- (funcall searchfn2 str eol t)
- (invalid-regexp nil)))))
- do (goto-char eol) and return t
- else do (goto-char eol)
- finally return nil))
-
-(defun helm-mm-3-search (pattern &rest _ignore)
- (when (stringp pattern)
- (setq pattern (helm-mm-3-get-patterns pattern)))
- (helm-mm-3-search-base
- pattern 're-search-forward 're-search-forward))
-\f
-;;; mp-3 with migemo
-;;
-;;
-(defvar helm-mm--previous-migemo-info nil
- "[Internal] Cache previous migemo query.")
-(make-local-variable 'helm-mm--previous-migemo-info)
-
-(declare-function migemo-get-pattern "ext:migemo.el")
-(declare-function migemo-search-pattern-get "ext:migemo.el")
-
-(define-minor-mode helm-migemo-mode
- "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."
- :lighter " Hmio"
- :group 'helm
- :global t
- (cl-assert (featurep 'migemo)
- nil "No feature called migemo found, install migemo.el."))
-
-(defun helm-mm-migemo-get-pattern (pattern)
- (let ((regex (migemo-get-pattern pattern)))
- (if (ignore-errors (string-match regex "") t)
- (concat regex "\\|" pattern) pattern)))
-
-(defun helm-mm-migemo-search-pattern-get (pattern)
- (let ((regex (migemo-search-pattern-get pattern)))
- (if (ignore-errors (string-match regex "") t)
- (concat regex "\\|" pattern) pattern)))
-
-(defun helm-mm-migemo-string-match (pattern str)
- "Migemo version of `string-match'."
- (unless (assoc pattern helm-mm--previous-migemo-info)
- (with-helm-buffer
- (setq helm-mm--previous-migemo-info
- (push (cons pattern (helm-mm-migemo-get-pattern pattern))
- helm-mm--previous-migemo-info))))
- (string-match (assoc-default pattern helm-mm--previous-migemo-info) str))
-
-(cl-defun helm-mm-3-migemo-match (str &optional (pattern helm-pattern))
- (and helm-migemo-mode
- (cl-loop for (pred . re) in (helm-mm-3-get-patterns pattern)
- always (funcall pred (helm-mm-migemo-string-match re str)))))
-
-(defun helm-mm-migemo-forward (word &optional bound noerror count)
- (with-helm-buffer
- (unless (assoc word helm-mm--previous-migemo-info)
- (setq helm-mm--previous-migemo-info
- (push (cons word (if (delq 'ascii (find-charset-string word))
- word
- (helm-mm-migemo-search-pattern-get word)))
- helm-mm--previous-migemo-info))))
- (re-search-forward
- (assoc-default word helm-mm--previous-migemo-info) bound noerror count))
-
-(defun helm-mm-3-migemo-search (pattern &rest _ignore)
- (and helm-migemo-mode
- (helm-mm-3-search-base
- pattern 'helm-mm-migemo-forward 'helm-mm-migemo-forward)))
-
-\f
-;;; mp-3p- (multiple regexp pattern 3 with prefix search)
-;;
-;;
-(defun helm-mm-3p-match (str &optional pattern)
- "Check if PATTERN match STR.
-Same as `helm-mm-3-match' but more strict, matching against prefix also.
-e.g \"bar foo\" will match \"barfoo\" but not \"foobar\" contrarily to
-`helm-mm-3-match'."
- (let* ((pat (helm-mm-3-get-patterns (or pattern helm-pattern)))
- (first (car pat)))
- (and (funcall (car first) (helm-mm-prefix-match str (cdr first)))
- (cl-loop for (predicate . regexp) in (cdr pat)
- always (funcall predicate (string-match regexp str))))))
-
-(defun helm-mm-3p-search (pattern &rest _ignore)
- (when (stringp pattern)
- (setq pattern (helm-mm-3-get-patterns pattern)))
- (helm-mm-3-search-base
- pattern 'helm-mm-prefix-search 're-search-forward))
-
-\f
-;;; Generic multi-match/search functions
-;;
-;;
-(cl-defun helm-mm-match (str &optional (pattern helm-pattern))
- (let ((fun (cl-ecase helm-mm-matching-method
- (multi1 #'helm-mm-1-match)
- (multi2 #'helm-mm-2-match)
- (multi3 #'helm-mm-3-match)
- (multi3p #'helm-mm-3p-match))))
- (funcall fun str pattern)))
-
-(defun helm-mm-search (pattern &rest _ignore)
- (let ((fun (cl-ecase helm-mm-matching-method
- (multi1 #'helm-mm-1-search)
- (multi2 #'helm-mm-2-search)
- (multi3 #'helm-mm-3-search)
- (multi3p #'helm-mm-3p-search))))
- (funcall fun pattern)))
-
-
-(provide 'helm-multi-match)
-
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-multi-match.el ends here
+++ /dev/null
-;;; helm-net.el --- helm browse url and search web. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'url)
-(require 'xml)
-(require 'browse-url)
-
-\f
-(defgroup helm-net nil
- "Net related applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-google-suggest-default-browser-function 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'."
- :group 'helm-net
- :type 'symbol)
-
-(defcustom helm-home-url "http://www.google.fr"
- "Default url to use as home url."
- :group 'helm-net
- :type 'string)
-
-(defcustom helm-surfraw-default-browser-function nil
- "The browse url function you prefer to use with surfraw.
-When nil, fallback to `browse-url-browser-function'."
- :group 'helm-net
- :type 'symbol)
-
-(defcustom helm-google-suggest-url
- "http://google.com/complete/search?output=toolbar&q="
- "URL used for looking up Google suggestions."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-google-suggest-search-url
- "http://www.google.com/search?ie=utf-8&oe=utf-8&q=%s"
- "URL used for Google searching."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-net-prefer-curl nil
- "When non--nil use CURL external program to fetch data.
-Otherwise `url-retrieve-synchronously' is used."
- :type 'boolean
- :group 'helm-net)
-
-(defvaralias 'helm-google-suggest-use-curl-p 'helm-net-prefer-curl)
-(make-obsolete-variable 'helm-google-suggest-use-curl-p 'helm-net-prefer-curl "1.7.7")
-
-(defcustom helm-surfraw-duckduckgo-url
- "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."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-wikipedia-suggest-url
- "https://en.wikipedia.org/w/api.php?action=opensearch&search="
- "Url used for looking up Wikipedia suggestions."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-wikipedia-url
- "https://en.wikipedia.org/wiki/Special:Search?search=%s"
- "The Wikipedia search url.
-This is a format string, don't forget the `%s'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-wikipedia-summary-url
- "http://en.wikipedia.org/w/api.php?action=parse&format=json&prop=text§ion=0&page="
- "URL for getting the summary of a Wikipedia topic."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-wikipedia-follow-delay 2
- "Delay before wikipedia summary popup."
- :type 'number
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-youtube-url
- "http://www.youtube.com/results?aq=f&search_query=%s"
- "The Youtube search url.
-This is a format string, don't forget the `%s'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-imdb-url
- "http://www.imdb.com/find?s=all&q=%s"
- "The IMDb search url.
-This is a format string, don't forget the `%s'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-google-maps-url
- "http://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'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-google-news-url
- "http://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'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-google-suggest-actions
- '(("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))))
- "List of actions for google suggest sources."
- :group 'helm-net
- :type '(alist :key-type string :value-type function))
-
-(defcustom helm-browse-url-firefox-new-window "-new-tab"
- "Allow choosing to browse url in new window or new tab.
-Can be \"-new-tab\" (default) or \"-new-window\"."
- :group 'helm-net
- :type '(radio
- (const :tag "New tab" "-new-tab")
- (const :tag "New window" "-new-window")))
-
-\f
-;;; Additional actions for search suggestions
-;;
-;;
-;; Internal
-
-(defun helm-search-suggest-perform-additional-action (url query)
- "Perform the search via URL using QUERY as input."
- (browse-url (format url (url-hexify-string query))))
-
-(defun helm-net--url-retrieve-sync (request parser)
- (if helm-net-prefer-curl
- (with-temp-buffer
- (call-process "curl" nil t nil request)
- (funcall parser))
- (with-current-buffer (url-retrieve-synchronously request)
- (funcall parser))))
-
-\f
-;;; Google Suggestions
-;;
-;;
-(defun helm-google-suggest-parser ()
- (cl-loop
- with result-alist = (xml-get-children
- (car (xml-parse-region
- (point-min) (point-max)))
- 'CompleteSuggestion)
- for i in result-alist collect
- (cdr (cl-caadr (assoc 'suggestion i)))))
-
-(defun helm-google-suggest-fetch (input)
- "Fetch suggestions for INPUT from XML buffer."
- (let ((request (concat helm-google-suggest-url
- (url-hexify-string input))))
- (helm-net--url-retrieve-sync
- request #'helm-google-suggest-parser)))
-
-(defun helm-google-suggest-set-candidates (&optional request-prefix)
- "Set candidates with result and number of google results found."
- (let ((suggestions (helm-google-suggest-fetch
- (or (and request-prefix
- (concat request-prefix
- " " helm-pattern))
- helm-pattern))))
- (if (member helm-pattern suggestions)
- suggestions
- ;; if there is no suggestion exactly matching the input then
- ;; prepend a Search on Google item to the list
- (append
- suggestions
- (list (cons (format "Search for '%s' on Google" helm-input)
- helm-input))))))
-
-(defun helm-ggs-set-number-result (num)
- (if num
- (progn
- (and (numberp num) (setq num (number-to-string num)))
- (cl-loop for i in (reverse (split-string num "" t))
- for count from 1
- append (list i) into C
- when (= count 3)
- append (list ",") into C
- and do (setq count 0)
- finally return
- (replace-regexp-in-string
- "^," "" (mapconcat 'identity (reverse C) ""))))
- "?"))
-
-(defun helm-google-suggest-action (candidate)
- "Default action to jump to a google suggested candidate."
- (let ((arg (format helm-google-suggest-search-url
- (url-hexify-string candidate))))
- (helm-aif helm-google-suggest-default-browser-function
- (funcall it arg)
- (helm-browse-url arg))))
-
-(defvar helm-google-suggest-default-function
- 'helm-google-suggest-set-candidates
- "Default function to use in helm google suggest.")
-
-(defvar helm-source-google-suggest
- (helm-build-sync-source "Google Suggest"
- :candidates (lambda ()
- (funcall helm-google-suggest-default-function))
- :action 'helm-google-suggest-actions
- :volatile t
- :keymap helm-map
- :requires-pattern 3))
-
-(defun helm-google-suggest-emacs-lisp ()
- "Try to emacs lisp complete with google suggestions."
- (helm-google-suggest-set-candidates "emacs lisp"))
-
-;;; Wikipedia suggestions
-;;
-;;
-(declare-function json-read-from-string "json" (string))
-(defun helm-wikipedia-suggest-fetch ()
- "Fetch Wikipedia suggestions and return them as a list."
- (require 'json)
- (let ((request (concat helm-wikipedia-suggest-url
- (url-hexify-string helm-pattern))))
- (helm-net--url-retrieve-sync
- request #'helm-wikipedia--parse-buffer)))
-
-(defun helm-wikipedia--parse-buffer ()
- (goto-char (point-min))
- (when (re-search-forward "^\\[.+\\[\\(.*\\)\\]\\]" nil t)
- (cl-loop for i across (aref (json-read-from-string (match-string 0)) 1)
- collect i into result
- finally return (or result
- (append
- result
- (list (cons (format "Search for '%s' on wikipedia"
- helm-pattern)
- helm-pattern)))))))
-
-(defvar helm-wikipedia--summary-cache (make-hash-table :test 'equal))
-(defun helm-wikipedia-persistent-action (candidate)
- (unless (string= (format "Search for '%s' on wikipedia"
- helm-pattern)
- (helm-get-selection nil t))
- (message "Fetching summary from Wikipedia...")
- (let ((buf (get-buffer-create "*helm wikipedia summary*"))
- result mess)
- (while (progn
- (setq result (or (gethash candidate helm-wikipedia--summary-cache)
- (puthash candidate
- (prog1
- (helm-wikipedia-fetch-summary candidate)
- (setq mess "Done"))
- helm-wikipedia--summary-cache)))
- (when (and result
- (listp result))
- (setq candidate (cdr result))
- (message "Redirected to %s" candidate)
- t)))
- (if (not result)
- (message "Error when getting summary.")
- (with-current-buffer buf
- (erase-buffer)
- (setq cursor-type nil)
- (insert result)
- (fill-region (point-min) (point-max))
- (goto-char (point-min)))
- (display-buffer buf)
- (message mess)))))
-
-(defun helm-wikipedia-fetch-summary (input)
- (let* ((request (concat helm-wikipedia-summary-url
- (url-hexify-string input))))
- (helm-net--url-retrieve-sync
- request #'helm-wikipedia--parse-summary)))
-
-(defun helm-wikipedia--parse-summary ()
- (goto-char (point-min))
- (when (search-forward "{" nil t)
- (let ((result (cdr (assoc '*
- (assoc 'text
- (assoc 'parse
- (json-read-from-string
- (buffer-substring-no-properties
- (1- (point)) (point-max)))))))))
- (when result
- (if (string-match "<span class=\"redirectText\"><a href=[^>]+>\\([^<]+\\)" result)
- (cons 'redirect (match-string 1 result))
-
- ;; find the beginning of the summary text in the result
-
- ;; check if there is a table before the summary and skip that
- (when (or (string-match "</table>\\(\n<div.*?</div>\\)?\n<p>" result)
- ;; otherwise just find the first paragraph
- (string-match "<p>" result))
- ;; remove cruft and do a simple formatting
- (replace-regexp-in-string
- "Cite error: .*" ""
- (replace-regexp-in-string
- " " ""
- (replace-regexp-in-string
- "\\[[^\]]+\\]" ""
- (replace-regexp-in-string
- "<[^>]*>" ""
- (replace-regexp-in-string
- "</p>\n<p>" "\n\n"
- (substring result (match-end 0)))))))))))))
-
-
-(defvar helm-source-wikipedia-suggest
- (helm-build-sync-source "Wikipedia Suggest"
- :candidates #'helm-wikipedia-suggest-fetch
- :action '(("Wikipedia" . (lambda (candidate)
- (helm-search-suggest-perform-additional-action
- helm-search-suggest-action-wikipedia-url
- candidate))))
- :persistent-action #'helm-wikipedia-persistent-action
- :volatile t
- :keymap helm-map
- :follow 1
- :follow-delay helm-wikipedia-follow-delay
- :requires-pattern 3))
-
-\f
-;;; Web browser functions.
-;;
-;;
-;; If default setting of `w3m-command' is not
-;; what you want and you modify it, you will have to reeval
-;; also `helm-browse-url-default-browser-alist'.
-
-(defvar helm-browse-url-chromium-program "chromium-browser")
-(defvar helm-browse-url-uzbl-program "uzbl-browser")
-(defvar helm-browse-url-conkeror-program "conkeror")
-(defvar helm-browse-url-default-browser-alist
- `((,(or (and (boundp 'w3m-command) w3m-command)
- "/usr/bin/w3m") . w3m-browse-url)
- (,browse-url-firefox-program . browse-url-firefox)
- (,helm-browse-url-chromium-program . helm-browse-url-chromium)
- (,helm-browse-url-conkeror-program . helm-browse-url-conkeror)
- (,helm-browse-url-uzbl-program . helm-browse-url-uzbl)
- (,browse-url-kde-program . browse-url-kde)
- (,browse-url-gnome-moz-program . browse-url-gnome-moz)
- (,browse-url-mozilla-program . browse-url-mozilla)
- (,browse-url-galeon-program . browse-url-galeon)
- (,browse-url-netscape-program . browse-url-netscape)
- (,browse-url-mosaic-program . browse-url-mosaic)
- (,browse-url-xterm-program . browse-url-text-xterm)
- ("emacs" . eww-browse-url))
- "*Alist of \(executable . function\) to try to find a suitable url browser.")
-
-(cl-defun helm-generic-browser (url cmd-name &rest args)
- "Browse URL with NAME browser."
- (let ((proc (concat cmd-name " " url)))
- (message "Starting %s..." cmd-name)
- (apply 'start-process proc nil cmd-name
- (append args (list url)))
- (set-process-sentinel
- (get-process proc)
- (lambda (process event)
- (when (string= event "finished\n")
- (message "%s process %s" process event))))))
-
-(defun 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 open
-and not be prompted to kill firefox process.
-
-NOTE: Probably not supported on some systems (e.g Windows)."
- (interactive (list (read-string "URL: " (browse-url-url-at-point))
- nil))
- (let ((process-environment (browse-url-process-environment)))
- (call-process-shell-command
- (format "(%s %s %s &)"
- browse-url-firefox-program
- helm-browse-url-firefox-new-window
- url))))
-
-(defun helm-browse-url-chromium (url &optional _ignore)
- "Browse URL with google chrome browser."
- (interactive "sURL: ")
- (helm-generic-browser
- url helm-browse-url-chromium-program))
-
-(defun helm-browse-url-uzbl (url &optional _ignore)
- "Browse URL with uzbl browser."
- (interactive "sURL: ")
- (helm-generic-browser url helm-browse-url-uzbl-program "-u"))
-
-(defun helm-browse-url-conkeror (url &optional _ignore)
- "Browse URL with conkeror browser."
- (interactive "sURL: ")
- (helm-generic-browser url helm-browse-url-conkeror-program))
-
-(defun helm-browse-url-default-browser (url &rest args)
- "Find the first available browser and ask it to load URL."
- (let ((default-browser-fn
- (cl-loop for (exe . fn) in helm-browse-url-default-browser-alist
- thereis (and exe (executable-find exe) (fboundp fn) fn))))
- (if default-browser-fn
- (apply default-browser-fn url args)
- (error "No usable browser found"))))
-
-(defun helm-browse-url (url &rest args)
- "Default command to browse URL."
- (if browse-url-browser-function
- (browse-url url args)
- (helm-browse-url-default-browser url args)))
-
-\f
-;;; Surfraw
-;;
-;; Need external program surfraw.
-;; <http://surfraw.alioth.debian.org/>
-
-;; Internal
-(defvar helm-surfraw-engines-history nil)
-(defvar helm-surfraw-input-history nil)
-(defvar helm-surfraw--elvi-cache nil)
-
-(defun helm-build-elvi-list ()
- "Return list of all engines and descriptions handled by surfraw."
- (or helm-surfraw--elvi-cache
- (setq helm-surfraw--elvi-cache
- (cdr (with-temp-buffer
- (call-process "surfraw" nil t nil "-elvi")
- (split-string (buffer-string) "\n"))))))
-
-;;;###autoload
-(defun helm-surfraw (pattern engine)
- "Preconfigured `helm' to search PATTERN with search ENGINE."
- (interactive (list (read-string "SearchFor: "
- nil 'helm-surfraw-input-history
- (thing-at-point 'symbol))
- (helm-comp-read
- "Engine: "
- (helm-build-elvi-list)
- :must-match t
- :name "Surfraw Search Engines"
- :del-input nil
- :history helm-surfraw-engines-history)))
- (let* ((engine-nodesc (car (split-string engine)))
- (url (if (string= engine-nodesc "duckduckgo")
- ;; "sr duckduckgo -p foo" is broken, workaround.
- (format helm-surfraw-duckduckgo-url
- (url-hexify-string pattern))
- (with-temp-buffer
- (apply 'call-process "surfraw" nil t nil
- (append (list engine-nodesc "-p") (split-string pattern)))
- (replace-regexp-in-string
- "\n" "" (buffer-string)))))
- (browse-url-browser-function (or helm-surfraw-default-browser-function
- browse-url-browser-function)))
- (if (string= engine-nodesc "W")
- (helm-browse-url helm-home-url)
- (helm-browse-url url)
- (setq helm-surfraw-engines-history
- (cons engine (delete engine helm-surfraw-engines-history))))))
-
-;;;###autoload
-(defun helm-google-suggest ()
- "Preconfigured `helm' for google search with google suggest."
- (interactive)
- (helm-other-buffer 'helm-source-google-suggest "*helm google*"))
-
-;;;###autoload
-(defun helm-wikipedia-suggest ()
- "Preconfigured `helm' for Wikipedia lookup with Wikipedia suggest."
- (interactive)
- (helm :sources 'helm-source-wikipedia-suggest
- :buffer "*helm wikipedia*"))
-
-
-(provide 'helm-net)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-net.el ends here
+++ /dev/null
-;;; helm-org.el --- Helm for org headlines and keywords completion -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-utils)
-(require 'org)
-
-(declare-function org-agenda-switch-to "org-agenda.el")
-
-(defgroup helm-org nil
- "Org related functions for helm."
- :group 'helm)
-
-(defcustom helm-org-headings-fontify nil
- "Fontify org buffers before parsing them.
-This reflect fontification in helm-buffer when non--nil.
-NOTE: This will be slow on large org buffers."
- :group 'helm-org
- :type 'boolean)
-
-(defcustom helm-org-format-outline-path nil
- "Show all org level as path."
- :group 'helm-org
- :type 'boolean)
-
-(defcustom helm-org-show-filename nil
- "Show org filenames in `helm-org-agenda-files-headings' when non--nil.
-Note this have no effect in `helm-org-in-buffer-headings'."
- :group 'helm-org
- :type 'boolean)
-
-(defcustom helm-org-headings-min-depth 1
- "Minimum depth of org headings to start with."
- :group 'helm-org
- :type 'integer)
-
-(defcustom helm-org-headings-max-depth 8
- "Go down to this maximum depth of org headings."
- :group 'helm-org
- :type 'integer)
-
-;;; Org capture templates
-;;
-;;
-(defvar org-capture-templates)
-(defun helm-source-org-capture-templates ()
- (helm-build-sync-source "Org Capture Templates:"
- :candidates (cl-loop for template in org-capture-templates
- collect (cons (nth 1 template) (nth 0 template)))
- :action '(("Do capture" . (lambda (template-shortcut)
- (org-capture nil template-shortcut))))))
-
-;;; Org headings
-;;
-;;
-(defun helm-org-goto-marker (marker)
- (switch-to-buffer (marker-buffer marker))
- (goto-char (marker-position marker))
- (org-show-context)
- (re-search-backward "^\\*+ " nil t)
- (org-show-entry))
-
-(defun helm-source-org-headings-for-files (filenames &optional parents)
- (helm-build-sync-source "Org Headings"
- :candidates filenames ; Start with only filenames.
- :match (lambda (candidate)
- (string-match
- helm-pattern
- (helm-aif (get-text-property 0 'helm-real-display candidate)
- it
- candidate)))
- :candidate-transformer
- ;; Now that the helm-window is available proceed to truncation
- ;; and other transformations.
- (lambda (candidates)
- (let ((cands (helm-org-get-candidates candidates parents)))
- (if parents (nreverse cands) cands)))
- :action '(("Go to line" . helm-org-goto-marker)
- ("Refile to this heading" . helm-org-heading-refile)
- ("Insert link to this heading"
- . helm-org-insert-link-to-heading-at-marker))))
-
-(defun helm-org-get-candidates (filenames &optional parents)
- (helm-flatten-list
- (mapcar (lambda (filename)
- (helm-org--get-candidates-in-file
- filename
- helm-org-headings-fontify
- (or parents (null helm-org-show-filename))
- parents))
- filenames)
- t))
-
-(defun helm-org--get-candidates-in-file (filename &optional fontify nofname parents)
- (with-current-buffer (pcase filename
- ((pred bufferp) filename)
- ((pred stringp) (find-file-noselect filename)))
- (and fontify (jit-lock-fontify-now))
- (let ((match-fn (if fontify
- #'match-string
- #'match-string-no-properties))
- (search-fn (lambda ()
- (when (or (null parents)
- (org-up-heading-safe))
- (re-search-forward
- org-complex-heading-regexp nil t)))))
- (save-excursion
- (save-restriction
- (widen)
- (unless parents (goto-char (point-min)))
- (cl-loop with width = (window-width (helm-window))
- while (funcall search-fn)
- for all = (funcall match-fn 0)
- for truncated-all = (if (and all (> (length all) width))
- (substring all 0 width) all)
- for level = (length (match-string-no-properties 1))
- for heading = (funcall match-fn 4)
- for file = (unless nofname
- (concat (helm-basename filename) ":"))
- if (and (>= level helm-org-headings-min-depth)
- (<= level helm-org-headings-max-depth))
- collect (cons (propertize
- (if helm-org-format-outline-path
- (org-format-outline-path
- (append (apply #'org-get-outline-path
- (unless parents
- (list t level heading)))
- (list heading))
- width file)
- (if file
- (concat file truncated-all)
- truncated-all))
- 'helm-real-display heading)
- (point-marker))))))))
-
-(defun helm-org-insert-link-to-heading-at-marker (marker)
- (with-current-buffer (marker-buffer marker)
- (let ((heading-name (save-excursion (goto-char (marker-position marker))
- (nth 4 (org-heading-components))))
- (file-name (buffer-file-name)))
- (with-helm-current-buffer
- (org-insert-link
- file-name (concat "file:" file-name "::*" heading-name))))))
-
-(defun helm-org-heading-refile (marker)
- (save-selected-window
- (when (eq major-mode 'org-agenda-mode)
- (org-agenda-switch-to))
- (org-cut-subtree)
- (let ((target-level (with-current-buffer (marker-buffer marker)
- (goto-char (marker-position marker))
- (org-current-level))))
- (helm-org-goto-marker marker)
- (org-end-of-subtree t t)
- (org-paste-subtree (+ target-level 1)))))
-
-;;;###autoload
-(defun helm-org-agenda-files-headings ()
- "Preconfigured helm for org files headings."
- (interactive)
- (helm :sources (helm-source-org-headings-for-files (org-agenda-files))
- :candidate-number-limit 99999
- :buffer "*helm org headings*"))
-
-;;;###autoload
-(defun helm-org-in-buffer-headings ()
- "Preconfigured helm for org buffer headings."
- (interactive)
- (let ((helm-org-show-filename nil))
- (helm :sources (helm-source-org-headings-for-files
- (list (current-buffer)))
- :candidate-number-limit 99999
- :buffer "*helm org inbuffer*")))
-
-;;;###autoload
-(defun helm-org-parent-headings ()
- "Preconfigured helm for org headings that are parents of the
-current heading."
- (interactive)
- ;; Use a large max-depth to ensure all parents are displayed.
- (let ((helm-org-headings-min-depth 1)
- (helm-org-headings-max-depth 50))
- (helm :sources (helm-source-org-headings-for-files
- (list (current-buffer)) t)
- :candidate-number-limit 99999
- :buffer "*helm org parent headings*")))
-
-;;;###autoload
-(defun helm-org-capture-templates ()
- "Preconfigured helm for org templates."
- (interactive)
- (helm :sources (helm-source-org-capture-templates)
- :candidate-number-limit 99999
- :buffer "*helm org capture templates*"))
-
-
-(provide 'helm-org)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-org.el ends here
+++ /dev/null
-(define-package "helm" "20160105.2046" "Helm is an Emacs incremental and narrowing framework"
- '((emacs "24")
- (cl-lib "0.5")
- (async "1.6")
- (helm-core "1.9.1"))
- :url "https://emacs-helm.github.io/helm/")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
+++ /dev/null
-;;; helm-plugin.el --- Helm plugins -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-utils)
-
-\f
-;;; Plug-in: `info-index'
-;;
-;;
-(defun helm-make-info-source (source file)
- `(,@source
- (name . ,(concat "Info Index: " file))
- (info-file . ,file)
- (init . helm-info-init)
- (display-to-real . helm-info-display-to-real)
- (get-line . buffer-substring)
- (candidates-in-buffer)
- (action ("Goto node" . helm-info-goto))))
-
-(defun helm-compile-source--info-index (source)
- (helm-aif (helm-interpret-value (assoc-default 'info-index source))
- (helm-make-info-source source it)
- source))
-
-(add-to-list 'helm-compile-source-functions 'helm-compile-source--info-index)
-
-(helm-document-attribute 'info-index "info-index plugin"
- " Create a source of info index very easily.
-
- Example:
-
- (defvar helm-source-info-wget '((info-index . \"wget\"))")
-
-\f
-;;; Plug-in: `candidates-file'
-;;
-;; List all lines in a file.
-(defun helm-compile-source--candidates-file (source)
- (if (assoc-default 'candidates-file source)
- `((init helm-p-candidates-file-init
- ,@(let ((orig-init (assoc-default 'init source)))
- (cond ((null orig-init) nil)
- ((functionp orig-init) (list orig-init))
- (t orig-init))))
- (candidates-in-buffer)
- ,@source)
- source))
-(add-to-list 'helm-compile-source-functions 'helm-compile-source--candidates-file)
-
-(defun helm-p-candidates-file-init ()
- (cl-destructuring-bind (file &optional updating)
- (helm-mklist (helm-attr 'candidates-file))
- (setq file (helm-interpret-value file))
- (with-current-buffer (helm-candidate-buffer 'global)
- (insert-file-contents file)
- (when updating
- (buffer-disable-undo)
- (font-lock-mode -1)
- (auto-revert-mode 1)))))
-
-(helm-document-attribute 'candidates-file "candidates-file plugin"
- " Use a file as the candidates buffer.
-
- 1st argument is a filename, string or function name or variable
- name. If optional 2nd argument is non-nil, the file is opened with
- `auto-revert-mode' enabled.
-
- Example:
-
- \(defvar helm-source-test-file
- '((name . \"test1\")
- (candidates-file \"~/.emacs.el\" t)))
-
- Will list all lines in .emacs.el.")
-
-\f
-;;; Plug-in: `persistent-help'
-;;
-;; Add help about persistent action in `helm-buffer' header.
-(defun helm-compile-source--persistent-help (source)
- (if (assoc 'header-line source)
- source
- (append source '((header-line . helm-persistent-help-string)))))
-(add-to-list 'helm-compile-source-functions 'helm-compile-source--persistent-help)
-
-(defun helm-persistent-help-string ()
- (substitute-command-keys
- (concat "\\<helm-map>\\[helm-execute-persistent-action]: "
- (or (helm-interpret-value (helm-attr 'persistent-help))
- (helm-aif (or (assoc-default
- 'persistent-action
- (helm-get-current-source))
- (assoc-default
- 'action (helm-get-current-source)))
- (cond ((symbolp it)
- (symbol-name it))
- ((listp it)
- (or (ignore-errors (caar it)) ""))))
- "")
- " (keeping session)")))
-
-\f
-;;; Document new attributes
-;;
-;;
-(helm-document-attribute 'persistent-help "persistent-help plug-in"
- " A string to explain persistent-action of this source. It also
- accepts a function or a variable name.")
-
-
-(provide 'helm-plugin)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-plugin ends here
+++ /dev/null
-;;; helm-regexp.el --- In buffer regexp searching and replacement for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-utils)
-(require 'helm-plugin)
-
-(declare-function helm-mm-split-pattern "helm-multi-match")
-
-\f
-(defgroup helm-regexp nil
- "Regexp related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-moccur-always-search-in-current nil
- "Helm multi occur always search in current buffer when non--nil."
- :group 'helm-regexp
- :type 'boolean)
-
-(defcustom helm-moccur-use-ioccur-style-keys t
- "Similar to `helm-grep-use-ioccur-style-keys' but for multi occur."
- :group 'helm-regexp
- :type 'boolean)
-
-(defcustom helm-moccur-auto-update-on-resume nil
- "Allow auto updating helm-(m)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."
- :group 'helm-regexp
- :type '(radio :tag "Allow auto updating helm-(m)occur buffer when outdated."
- (const :tag "Always update without asking" noask)
- (const :tag "Never update and do not signal buffer needs update" never)
- (const :tag "Don't update but signal buffer needs update" nil)
- (const :tag "Update after confirmation" t)))
-
-(defcustom helm-source-multi-occur-actions
- '(("Go to Line" . helm-moccur-goto-line)
- ("Goto line other window" . helm-moccur-goto-line-ow)
- ("Goto line new frame" . helm-moccur-goto-line-of))
- "Actions for helm-occur and helm-moccur."
- :group 'helm-regexp
- :type '(alist :key-type string :value-type function))
-
-(defcustom helm-moccur-truncate-lines t
- "When nil the (m)occur line that appears will not be truncated."
- :group 'helm-regexp
- :type 'boolean)
-
-\f
-(defface helm-moccur-buffer
- '((t (:foreground "DarkTurquoise" :underline t)))
- "Face used to highlight moccur buffer names."
- :group 'helm-regexp)
-
-(defface helm-resume-need-update
- '((t (:background "red")))
- "Face used to flash moccur buffer when it needs update."
- :group 'helm-regexp)
-
-\f
-(defvar helm-moccur-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-goto-next-file)
- (define-key map (kbd "M-<up>") 'helm-goto-precedent-file)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- (define-key map (kbd "C-c o") 'helm-moccur-run-goto-line-ow)
- (define-key map (kbd "C-c C-o") 'helm-moccur-run-goto-line-of)
- (define-key map (kbd "C-x C-s") 'helm-moccur-run-save-buffer)
- (when helm-moccur-use-ioccur-style-keys
- (define-key map (kbd "<right>") 'helm-execute-persistent-action)
- (define-key map (kbd "<left>") 'helm-moccur-run-default-action))
- (delq nil map))
- "Keymap used in Moccur source.")
-
-\f
-;; History vars
-(defvar helm-build-regexp-history nil)
-(defvar helm-occur-history nil)
-
-(defun helm-query-replace-regexp (_candidate)
- "Query replace regexp from `helm-regexp'.
-With a prefix arg replace only matches surrounded by word boundaries,
-i.e Don't replace inside a word, regexp is surrounded with \\bregexp\\b."
- (let ((regexp helm-input))
- (apply 'query-replace-regexp
- (helm-query-replace-args regexp))))
-
-(defun helm-kill-regexp-as-sexp (_candidate)
- "Kill regexp in a format usable in lisp code."
- (helm-regexp-kill-new
- (prin1-to-string helm-input)))
-
-(defun helm-kill-regexp (_candidate)
- "Kill regexp as it is in `helm-pattern'."
- (helm-regexp-kill-new helm-input))
-
-(defun helm-query-replace-args (regexp)
- "create arguments of `query-replace-regexp' action in `helm-regexp'."
- (let ((region-only (helm-region-active-p)))
- (list
- regexp
- (query-replace-read-to regexp
- (format "Query replace %sregexp %s"
- (if helm-current-prefix-arg "word " "")
- (if region-only "in region " ""))
- t)
- helm-current-prefix-arg
- (when region-only (region-beginning))
- (when region-only (region-end)))))
-
-(defvar helm-source-regexp
- (helm-build-in-buffer-source "Regexp Builder"
- :init (lambda ()
- (helm-init-candidates-in-buffer
- 'global (with-temp-buffer
- (insert-buffer-substring helm-current-buffer)
- (buffer-string))))
- :get-line #'helm-regexp-get-line
- :persistent-action #'helm-regexp-persistent-action
- :persistent-help "Show this line"
- :multiline t
- :matchplugin nil
- :requires-pattern 2
- :mode-line "Press TAB to select action."
- :action '(("Kill Regexp as sexp" . helm-kill-regexp-as-sexp)
- ("Query Replace Regexp (C-u Not inside word.)"
- . helm-query-replace-regexp)
- ("Kill Regexp" . helm-kill-regexp))))
-
-(defun helm-regexp-get-line (s e)
- (let ((matches (match-data))
- (line (buffer-substring s e)))
- (propertize
- (cl-loop with ln = (format "%5d: %s" (1- (line-number-at-pos s)) line)
- for i from 0 to (1- (/ (length matches) 2))
- concat (format "\n %s'%s'" (format "Group %d: " i)
- (match-string i))
- into ln1
- finally return (concat ln ln1))
- 'helm-realvalue s)))
-
-(defun helm-regexp-persistent-action (pt)
- (helm-goto-char pt)
- (helm-highlight-current-line))
-
-(defun helm-regexp-kill-new (input)
- (kill-new input)
- (message "Killed: %s" input))
-
-\f
-;;; Occur
-;;
-;;
-(defvar helm-source-occur nil)
-(defun helm-occur-init-source ()
- (unless helm-source-occur
- (setq helm-source-occur
- (helm-make-source "Occur" 'helm-source-multi-occur))))
-
-\f
-;;; Multi occur
-;;
-;;
-
-;; Internal
-(defvar helm-multi-occur-buffer-list nil)
-(defvar helm-multi-occur-buffer-tick nil)
-(defun helm-moccur-init ()
- "Create the initial helm multi occur buffer."
- (helm-init-candidates-in-buffer
- 'global
- (cl-loop with buffers = (helm-attr 'moccur-buffers)
- for buf in buffers
- for bufstr = (with-current-buffer buf (buffer-string))
- do (add-text-properties
- 0 (length bufstr)
- `(buffer-name ,(buffer-name (get-buffer buf)))
- bufstr)
- concat bufstr)))
-
-(defun helm-moccur--next-or-previous-char ()
- (save-excursion
- (or (re-search-forward "^." nil t)
- (re-search-backward "^." nil t))))
-
-(defun helm-moccur-get-line (beg end)
- "Format line for `helm-source-moccur'."
- (prog1
- (format "%s:%d:%s"
- (get-text-property (if (= beg end)
- (helm-moccur--next-or-previous-char)
- beg)
- 'buffer-name)
- (save-restriction
- (narrow-to-region (or (previous-single-property-change
- (point) 'buffer-name) 1)
- (or (next-single-property-change
- (if (= beg end)
- (helm-moccur--next-or-previous-char)
- (point))
- 'buffer-name)
- (point-max)))
- (line-number-at-pos beg))
- ;; When matching empty line, use empty string
- ;; to allow saving and modifying with wgrep.
- (if (= beg end) "" (buffer-substring beg end)))
- ;; When matching empty line, forward char ("\n")
- ;; to not be blocked forever here.
- (when (= beg end) (forward-char 1))))
-
-(cl-defun helm-moccur-action (candidate
- &optional (method (quote buffer)) mark)
- "Jump to CANDIDATE with METHOD.
-arg METHOD can be one of buffer, buffer-other-window, buffer-other-frame."
- (require 'helm-grep)
- (let* ((split (helm-grep-split-line candidate))
- (buf (car split))
- (lineno (string-to-number (nth 1 split)))
- (split-pat (helm-mm-split-pattern helm-input)))
- (cl-case method
- (buffer (switch-to-buffer buf))
- (buffer-other-window (switch-to-buffer-other-window buf))
- (buffer-other-frame (switch-to-buffer-other-frame buf)))
- (helm-goto-line lineno)
- ;; Move point to the nearest matching regexp from bol.
- (cl-loop for reg in split-pat
- when (save-excursion
- (condition-case _err
- (if helm-migemo-mode
- (helm-mm-migemo-forward reg (point-at-eol) t)
- (re-search-forward reg (point-at-eol) t))
- (invalid-regexp nil)))
- collect (match-beginning 0) into pos-ls
- finally (when pos-ls (goto-char (apply #'min pos-ls))))
- (when mark
- (set-marker (mark-marker) (point))
- (push-mark (point) 'nomsg))))
-
-(defun helm-moccur-persistent-action (candidate)
- (helm-moccur-goto-line candidate)
- (helm-highlight-current-line))
-
-(defun helm-moccur-goto-line (candidate)
- "From multi occur, switch to buffer and go to nth 1 CANDIDATE line."
- (helm-moccur-action
- candidate 'buffer (or current-prefix-arg ; persistent.
- helm-current-prefix-arg))) ; exit.
-
-(defun helm-moccur-goto-line-ow (candidate)
- "Go to CANDIDATE line in other window.
-Same as `helm-moccur-goto-line' but go in other window."
- (helm-moccur-action
- candidate 'buffer-other-window
- (or current-prefix-arg ; persistent.
- helm-current-prefix-arg))) ; exit.
-
-(defun helm-moccur-goto-line-of (candidate)
- "Go to CANDIDATE line in new frame.
-Same as `helm-moccur-goto-line' but go in new frame."
- (helm-moccur-action
- candidate 'buffer-other-frame
- (or current-prefix-arg ; persistent.
- helm-current-prefix-arg))) ; exit.
-
-(defun helm-moccur-run-goto-line-ow ()
- "Run goto line other window action from `helm-source-moccur'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-moccur-goto-line-ow)))
-
-(defun helm-moccur-run-goto-line-of ()
- "Run goto line new frame action from `helm-source-moccur'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-moccur-goto-line-of)))
-
-(defun helm-moccur-run-default-action ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-moccur-goto-line)))
-
-(defvar helm-source-moccur nil)
-(defclass helm-source-multi-occur (helm-source-in-buffer)
- ((init :initform (lambda ()
- (require 'helm-grep)
- (helm-moccur-init)))
- (filter-one-by-one :initform 'helm-moccur-filter-one-by-one)
- (get-line :initform helm-moccur-get-line)
- (nohighlight :initform t)
- (nomark :initform t)
- (migemo :initform t)
- (action :initform 'helm-source-multi-occur-actions)
- (persistent-action :initform 'helm-moccur-persistent-action)
- (persistent-help :initform "Go to line")
- (resume :initform 'helm-moccur-resume-fn)
- (candidate-number-limit :initform 9999)
- (help-message :initform 'helm-moccur-help-message)
- (keymap :initform helm-moccur-map)
- (history :initform 'helm-occur-history)
- (requires-pattern :initform 2)))
-
-(defun helm-moccur-resume-fn ()
- (with-helm-buffer
- (let (new-tick-ls buffer-is-modified)
- (set (make-local-variable 'helm-multi-occur-buffer-list)
- (cl-loop for b in helm-multi-occur-buffer-list
- when (buffer-live-p (get-buffer b))
- collect b))
- (setq buffer-is-modified (/= (length helm-multi-occur-buffer-list)
- (length (helm-attr 'moccur-buffers))))
- (helm-attrset 'moccur-buffers helm-multi-occur-buffer-list)
- (setq new-tick-ls (cl-loop for b in helm-multi-occur-buffer-list
- collect (buffer-chars-modified-tick (get-buffer b))))
- (when buffer-is-modified
- (setq helm-multi-occur-buffer-tick new-tick-ls))
- (cl-assert (> (length helm-multi-occur-buffer-list) 0) nil
- "helm-resume error: helm-(m)occur buffer list is empty")
- (unless (eq helm-moccur-auto-update-on-resume 'never)
- (when (or buffer-is-modified
- (cl-loop for b in helm-multi-occur-buffer-list
- for new-tick = (buffer-chars-modified-tick (get-buffer b))
- for tick in helm-multi-occur-buffer-tick
- thereis (/= tick new-tick)))
- (helm-aif helm-moccur-auto-update-on-resume
- (when (or (eq it 'noask)
- (y-or-n-p "Helm (m)occur Buffer outdated, update? "))
- (run-with-idle-timer 0.1 nil (lambda ()
- (with-helm-buffer
- (helm-force-update)
- (message "Helm (m)occur Buffer have been udated")
- (sit-for 1) (message nil))))
- (unless buffer-is-modified (setq helm-multi-occur-buffer-tick new-tick-ls)))
- (run-with-idle-timer 0.1 nil (lambda ()
- (with-helm-buffer
- (let ((ov (make-overlay (save-excursion
- (goto-char (point-min))
- (forward-line 1)
- (point))
- (point-max))))
- (overlay-put ov 'face 'helm-resume-need-update)
- (sit-for 0.3) (delete-overlay ov)
- (message "[Helm occur Buffer outdated (C-c C-u to update)]")))))
- (unless buffer-is-modified
- (with-helm-after-update-hook
- (setq helm-multi-occur-buffer-tick new-tick-ls)
- (message "Helm (m)occur Buffer have been udated")))))))))
-
-(defun helm-moccur-filter-one-by-one (candidate)
- "`filter-one-by-one' function for `helm-source-moccur'."
- (require 'helm-grep)
- (let* ((split (helm-grep-split-line candidate))
- (buf (car split))
- (lineno (nth 1 split))
- (str (nth 2 split)))
- (cons (concat (propertize
- buf
- 'face 'helm-moccur-buffer
- 'help-echo (buffer-file-name
- (get-buffer buf))
- 'buffer-name buf)
- ":"
- (propertize lineno 'face 'helm-grep-lineno)
- ":"
- (helm-grep-highlight-match str t))
- candidate)))
-
-(defun helm-multi-occur-1 (buffers &optional input)
- "Main function to call `helm-source-moccur' with BUFFERS list."
- (let ((bufs (if helm-moccur-always-search-in-current
- (cons
- ;; will become helm-current-buffer later.
- (buffer-name (current-buffer))
- (remove helm-current-buffer buffers))
- buffers)))
- (unless helm-source-moccur
- (setq helm-source-moccur
- (helm-make-source "Moccur" 'helm-source-multi-occur)))
- (helm-attrset 'moccur-buffers bufs helm-source-moccur)
- (helm-set-local-variable 'helm-multi-occur-buffer-list bufs)
- (helm-set-local-variable
- 'helm-multi-occur-buffer-tick
- (cl-loop for b in bufs
- collect (buffer-chars-modified-tick (get-buffer b)))))
- (helm :sources 'helm-source-moccur
- :buffer "*helm multi occur*"
- :history 'helm-occur-history
- :keymap helm-moccur-map
- :input input
- :truncate-lines helm-moccur-truncate-lines))
-
-(defun helm-moccur-run-save-buffer ()
- "Run moccur save results action from `helm-moccur'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-moccur-save-results)))
-
-\f
-;;; helm-moccur-mode
-;;
-;;
-(defvar helm-moccur-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "RET") 'helm-moccur-mode-goto-line)
- (define-key map (kbd "C-o") 'helm-moccur-mode-goto-line-ow)
- (define-key map (kbd "<C-down>") 'helm-moccur-mode-goto-line-ow-forward)
- (define-key map (kbd "<C-up>") 'helm-moccur-mode-goto-line-ow-backward)
- (define-key map (kbd "<M-down>") 'helm-gm-next-file)
- (define-key map (kbd "<M-up>") 'helm-gm-precedent-file)
- (define-key map (kbd "M-n") 'helm-moccur-mode-goto-line-ow-forward)
- (define-key map (kbd "M-p") 'helm-moccur-mode-goto-line-ow-backward)
- (define-key map (kbd "M-N") 'helm-gm-next-file)
- (define-key map (kbd "M-P") 'helm-gm-precedent-file)
- map))
-
-(defun helm-moccur-mode-goto-line ()
- (interactive)
- (helm-aif (get-text-property (point) 'helm-realvalue)
- (helm-moccur-goto-line it)))
-
-(defun helm-moccur-mode-goto-line-ow ()
- (interactive)
- (helm-aif (get-text-property (point) 'helm-realvalue)
- (helm-moccur-goto-line-ow it)))
-
-(defun helm-moccur-mode-goto-line-ow-forward-1 (arg)
- (condition-case nil
- (progn
- (save-selected-window
- (helm-moccur-mode-goto-line-ow)
- (recenter))
- (forward-line arg))
- (error nil)))
-
-(defun helm-moccur-mode-goto-line-ow-forward ()
- (interactive)
- (helm-moccur-mode-goto-line-ow-forward-1 1))
-
-(defun helm-moccur-mode-goto-line-ow-backward ()
- (interactive)
- (helm-moccur-mode-goto-line-ow-forward-1 -1))
-
-(defun helm-moccur-save-results (_candidate)
- "Save helm moccur results in a `helm-moccur-mode' buffer."
- (let ((buf "*hmoccur*")
- new-buf)
- (when (get-buffer buf)
- (setq new-buf (helm-read-string "OccurBufferName: " buf))
- (cl-loop for b in (helm-buffer-list)
- when (and (string= new-buf b)
- (not (y-or-n-p
- (format "Buffer `%s' already exists overwrite? "
- new-buf))))
- do (setq new-buf (helm-read-string "OccurBufferName: " "*hmoccur ")))
- (setq buf new-buf))
- (with-current-buffer (get-buffer-create buf)
- (setq buffer-read-only t)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert "-*- mode: helm-moccur -*-\n\n"
- (format "Moccur Results for `%s':\n\n" helm-input))
- (save-excursion
- (insert (with-current-buffer helm-buffer
- (goto-char (point-min)) (forward-line 1)
- (buffer-substring (point) (point-max))))))
- (helm-moccur-mode) (pop-to-buffer buf))
- (message "Helm Moccur Results saved in `%s' buffer" buf)))
-
-;;;###autoload
-(define-derived-mode helm-moccur-mode
- special-mode "helm-moccur"
- "Major mode to provide actions in helm moccur saved buffer.
-
-Special commands:
-\\{helm-moccur-mode-map}"
- (set (make-local-variable 'helm-multi-occur-buffer-list)
- (with-helm-buffer helm-multi-occur-buffer-list))
- (set (make-local-variable 'revert-buffer-function)
- #'helm-moccur-mode--revert-buffer-function))
-
-(defun helm-moccur-mode--revert-buffer-function (&optional _ignore-auto _noconfirm)
- (goto-char (point-min))
- (let (pattern)
- (when (re-search-forward "^Moccur Results for `\\(.*\\)'" nil t)
- (setq pattern (match-string 1))
- (forward-line 0)
- (when (re-search-forward "^$" nil t)
- (forward-line 1))
- (let ((inhibit-read-only t)
- (buffer (current-buffer))
- (buflst helm-multi-occur-buffer-list))
- (delete-region (point) (point-max))
- (message "Reverting buffer...")
- (save-excursion
- (with-temp-buffer
- (insert
- "\n"
- (cl-loop for buf in buflst
- for bufstr = (or (and (buffer-live-p (get-buffer buf))
- (with-current-buffer buf
- (buffer-string)))
- "")
- unless (string= bufstr "")
- do (add-text-properties
- 0 (length bufstr)
- `(buffer-name ,(buffer-name (get-buffer buf)))
- bufstr)
- concat bufstr)
- "\n")
- (goto-char (point-min))
- (cl-loop while (re-search-forward pattern nil t)
- for line = (helm-moccur-get-line (point-at-bol) (point-at-eol))
- when line
- do (with-current-buffer buffer
- (insert
- (propertize
- (car (helm-moccur-filter-one-by-one line))
- 'helm-realvalue line)
- "\n")))))
- (message "Reverting buffer done")))))
-
-\f
-;;; Predefined commands
-;;
-;;
-
-;;;###autoload
-(defun helm-regexp ()
- "Preconfigured helm to build regexps.
-`query-replace-regexp' can be run from there against found regexp."
- (interactive)
- (save-restriction
- (when (and (helm-region-active-p)
- ;; Don't narrow to region if buffer is already narrowed.
- (not (helm-current-buffer-narrowed-p (current-buffer))))
- (narrow-to-region (region-beginning) (region-end)))
- (helm :sources helm-source-regexp
- :buffer "*helm regexp*"
- :prompt "Regexp: "
- :history 'helm-build-regexp-history)))
-
-;;;###autoload
-(defun helm-occur ()
- "Preconfigured helm for Occur."
- (interactive)
- (helm-occur-init-source)
- (let ((bufs (list (buffer-name (current-buffer)))))
- (helm-attrset 'moccur-buffers bufs helm-source-occur)
- (helm-set-local-variable 'helm-multi-occur-buffer-list bufs)
- (helm-set-local-variable
- 'helm-multi-occur-buffer-tick
- (cl-loop for b in bufs
- collect (buffer-chars-modified-tick (get-buffer b)))))
- (helm :sources 'helm-source-occur
- :buffer "*helm occur*"
- :history 'helm-occur-history
- :preselect (and (memq 'helm-source-occur helm-sources-using-default-as-input)
- (format "%s:%d:" (regexp-quote (buffer-name))
- (line-number-at-pos (point))))
- :truncate-lines helm-moccur-truncate-lines))
-
-;;;###autoload
-(defun helm-occur-from-isearch ()
- "Invoke `helm-occur' from isearch."
- (interactive)
- (let ((input (if isearch-regexp
- isearch-string
- (regexp-quote isearch-string)))
- (bufs (list (buffer-name (current-buffer)))))
- (isearch-exit)
- (helm-occur-init-source)
- (helm-attrset 'moccur-buffers bufs helm-source-occur)
- (helm-set-local-variable 'helm-multi-occur-buffer-list bufs)
- (helm-set-local-variable
- 'helm-multi-occur-buffer-tick
- (cl-loop for b in bufs
- collect (buffer-chars-modified-tick (get-buffer b))))
- (helm :sources 'helm-source-occur
- :buffer "*helm occur*"
- :history 'helm-occur-history
- :input input
- :truncate-lines helm-moccur-truncate-lines)))
-
-;;;###autoload
-(defun helm-multi-occur-from-isearch (&optional _arg)
- "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."
- (interactive "p")
- (let (buf-list
- helm-moccur-always-search-in-current
- (input (if isearch-regexp
- isearch-string
- (regexp-quote isearch-string))))
- (isearch-exit)
- (setq buf-list (helm-comp-read "Buffers: "
- (helm-buffer-list)
- :name "Occur in buffer(s)"
- :marked-candidates t))
- (setq helm-moccur-always-search-in-current
- (if (or current-prefix-arg
- helm-current-prefix-arg)
- (not helm-moccur-always-search-in-current)
- helm-moccur-always-search-in-current))
- (helm-multi-occur-1 buf-list input)))
-
-
-(provide 'helm-regexp)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-regexp.el ends here
+++ /dev/null
-;;; helm-ring.el --- kill-ring, mark-ring, and register browsers for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-utils)
-(require 'helm-help)
-(require 'helm-elisp)
-
-(declare-function undo-tree-restore-state-from-register "ext:undo-tree.el" (register))
-
-\f
-(defgroup helm-ring nil
- "Ring related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-kill-ring-threshold 3
- "Minimum length of a candidate to be listed by `helm-source-kill-ring'."
- :type 'integer
- :group 'helm-ring)
-
-(defcustom helm-kill-ring-max-lines-number 5
- "Max number of lines displayed per candidate in kill-ring browser.
-If nil or zero (disabled), don't truncate candidate, show all."
- :type '(choice (const :tag "Disabled" nil)
- (integer :tag "Max number of lines"))
- :group 'helm-ring)
-
-(defcustom helm-register-max-offset 160
- "Max size of string register entries before truncating."
- :group 'helm-ring
- :type 'integer)
-
-(defcustom helm-kill-ring-actions
- '(("Yank" . helm-kill-ring-action)
- ("Delete" . (lambda (_candidate)
- (cl-loop for cand in (helm-marked-candidates)
- do (setq kill-ring
- (delete cand kill-ring))))))
- "List of actions for kill ring source."
- :group 'helm-ring
- :type '(alist :key-type string :value-type function))
-
-\f
-;;; Kill ring
-;;
-;;
-(defvar helm-kill-ring-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-y") 'helm-next-line)
- (define-key map (kbd "M-u") 'helm-previous-line)
- map)
- "Keymap for `helm-show-kill-ring'.")
-
-(defvar helm-source-kill-ring
- (helm-build-sync-source "Kill Ring"
- :init (lambda () (helm-attrset 'last-command last-command))
- :candidates #'helm-kill-ring-candidates
- :filtered-candidate-transformer #'helm-kill-ring-transformer
- :action 'helm-kill-ring-actions
- :persistent-action (lambda (_candidate) (ignore))
- :persistent-help "DoNothing"
- :keymap helm-kill-ring-map
- :migemo t
- :multiline t)
- "Source for browse and insert contents of kill-ring.")
-
-(defun helm-kill-ring-candidates ()
- (cl-loop for kill in (helm-fast-remove-dups kill-ring :test 'equal)
- unless (or (< (length kill) helm-kill-ring-threshold)
- (string-match "\\`[\n[:blank:]]+\\'" kill))
- collect kill))
-
-(defun helm-kill-ring-transformer (candidates _source)
- "Display only the `helm-kill-ring-max-lines-number' lines of candidate."
- (cl-loop for i in candidates
- when (get-text-property 0 'read-only i)
- do (set-text-properties 0 (length i) '(read-only nil) i)
- for nlines = (with-temp-buffer (insert i) (count-lines (point-min) (point-max)))
- if (and helm-kill-ring-max-lines-number
- (> nlines helm-kill-ring-max-lines-number))
- collect (cons
- (with-temp-buffer
- (insert i)
- (goto-char (point-min))
- (concat
- (buffer-substring
- (point-min)
- (save-excursion
- (forward-line helm-kill-ring-max-lines-number)
- (point)))
- "[...]")) i)
- else collect i))
-
-(defun helm-kill-ring-action (str)
- "Insert STR in `kill-ring' and set STR to the head.
-If this action is executed just after `yank',
-replace with STR as yanked string."
- (with-helm-current-buffer
- (setq kill-ring (delete str kill-ring))
- (if (not (eq (helm-attr 'last-command helm-source-kill-ring) 'yank))
- (insert-for-yank str)
- ;; from `yank-pop'
- (let ((inhibit-read-only t)
- (before (< (point) (mark t))))
- (if before
- (funcall (or yank-undo-function 'delete-region) (point) (mark t))
- (funcall (or yank-undo-function 'delete-region) (mark t) (point)))
- (setq yank-undo-function nil)
- (set-marker (mark-marker) (point) helm-current-buffer)
- (insert-for-yank str)
- ;; Set the window start back where it was in the yank command,
- ;; if possible.
- (set-window-start (selected-window) yank-window-start t)
- (when before
- ;; This is like exchange-point-and-mark, but doesn't activate the mark.
- ;; It is cleaner to avoid activation, even though the command
- ;; loop would deactivate the mark because we inserted text.
- (goto-char (prog1 (mark t)
- (set-marker (mark-marker) (point) helm-current-buffer))))))
- (kill-new str)))
-
-\f
-;;;; <Mark ring>
-;; DO NOT use these sources with other sources use
-;; the commands `helm-mark-ring', `helm-global-mark-ring' or
-;; `helm-all-mark-rings' instead.
-
-(defun helm-mark-ring-line-string-at-pos (pos)
- "Return line string at position POS."
- (save-excursion
- (goto-char pos)
- (forward-line 0)
- (let ((line (car (split-string (thing-at-point 'line) "[\n\r]"))))
- (if (string= "" line)
- "<EMPTY LINE>"
- line))))
-
-(defun helm-mark-ring-get-candidates ()
- (with-helm-current-buffer
- (cl-loop with marks = (if (mark t) (cons (mark-marker) mark-ring) mark-ring)
- for i in marks
- with max-line-number = (line-number-at-pos (point-max))
- with width = (length (number-to-string max-line-number))
- for m = (format (concat "%" (number-to-string width) "d: %s")
- (line-number-at-pos i)
- (helm-mark-ring-line-string-at-pos i))
- unless (and recip (member m recip))
- collect m into recip
- finally return recip)))
-
-(defvar helm-source-mark-ring
- (helm-build-sync-source "mark-ring"
- :candidates #'helm-mark-ring-get-candidates
- :action '(("Goto line"
- . (lambda (candidate)
- (helm-goto-line (string-to-number candidate)))))
- :persistent-action (lambda (candidate)
- (helm-goto-line (string-to-number candidate))
- (helm-highlight-current-line))
- :persistent-help "Show this line"))
-
-;;; Global-mark-ring
-(defvar helm-source-global-mark-ring
- (helm-build-sync-source "global-mark-ring"
- :candidates #'helm-global-mark-ring-get-candidates
- :action '(("Goto line"
- . (lambda (candidate)
- (let ((items (split-string candidate ":")))
- (switch-to-buffer (cl-second items))
- (helm-goto-line (string-to-number (car items)))))))
- :persistent-action (lambda (candidate)
- (let ((items (split-string candidate ":")))
- (switch-to-buffer (cl-second items))
- (helm-goto-line (string-to-number (car items)))
- (helm-highlight-current-line)))
- :persistent-help "Show this line"))
-
-(defun helm-global-mark-ring-format-buffer (marker)
- (with-current-buffer (marker-buffer marker)
- (goto-char marker)
- (forward-line 0)
- (let ((line (pcase (thing-at-point 'line)
- ((and line (pred stringp)
- (guard (not (string-match-p "\\`\n?\\'" line))))
- (car (split-string line "[\n\r]")))
- (_ "<EMPTY LINE>"))))
- (format "%7d:%s: %s"
- (line-number-at-pos) (marker-buffer marker) line))))
-
-(defun helm-global-mark-ring-get-candidates ()
- (let ((marks global-mark-ring))
- (when marks
- (cl-loop for i in marks
- for mb = (marker-buffer i)
- for gm = (unless (or (string-match "^ " (format "%s" mb))
- (null mb))
- (helm-global-mark-ring-format-buffer i))
- when (and gm (not (member gm recip)))
- collect gm into recip
- finally return recip))))
-
-(defun helm--push-mark (&optional location nomsg activate)
- "[Internal] Don't use directly, use instead `helm-push-mark-mode'."
- (unless (null (mark t))
- (setq mark-ring (cons (copy-marker (mark-marker)) mark-ring))
- (when (> (length mark-ring) mark-ring-max)
- (move-marker (car (nthcdr mark-ring-max mark-ring)) nil)
- (setcdr (nthcdr (1- mark-ring-max) mark-ring) nil)))
- (set-marker (mark-marker) (or location (point)) (current-buffer))
- ;; Now push the mark on the global mark ring.
- (setq global-mark-ring (cons (copy-marker (mark-marker))
- ;; Avoid having multiple entries
- ;; for same buffer in `global-mark-ring'.
- (cl-loop with mb = (current-buffer)
- for m in global-mark-ring
- for nmb = (marker-buffer m)
- unless (eq mb nmb)
- collect m)))
- (when (> (length global-mark-ring) global-mark-ring-max)
- (move-marker (car (nthcdr global-mark-ring-max global-mark-ring)) nil)
- (setcdr (nthcdr (1- global-mark-ring-max) global-mark-ring) nil))
- (or nomsg executing-kbd-macro (> (minibuffer-depth) 0)
- (message "Mark set"))
- (when (or activate (not transient-mark-mode))
- (set-mark (mark t)))
- nil)
-
-(defadvice push-mark (around helm-push-mark-mode)
- (helm--push-mark location nomsg activate))
-
-;;;###autoload
-(define-minor-mode helm-push-mark-mode
- "Provide an improved version of `push-mark'.
-Modify the behavior of `push-mark' to update
-the `global-mark-ring' after each new visit."
- :group 'helm-ring
- :global t
- (if helm-push-mark-mode
- (if (fboundp 'advice-add)
- (advice-add 'push-mark :override #'helm--push-mark)
- (ad-activate 'push-mark))
- (if (fboundp 'advice-remove)
- (advice-remove 'push-mark #'helm--push-mark)
- (ad-deactivate 'push-mark))))
-\f
-;;;; <Register>
-;;; Insert from register
-(defvar helm-source-register
- (helm-build-sync-source "Registers"
- :candidates #'helm-register-candidates
- :action-transformer #'helm-register-action-transformer
- :persistent-help ""
- :multiline t
- :action '(("Delete Register(s)" .
- (lambda (_candidate)
- (cl-loop for candidate in (helm-marked-candidates)
- for register = (car candidate)
- do (setq register-alist
- (delq (assoc register register-alist)
- register-alist)))))))
- "See (info \"(emacs)Registers\")")
-
-(defun helm-register-candidates ()
- "Collecting register contents and appropriate commands."
- (cl-loop for (char . val) in register-alist
- for key = (single-key-description char)
- for string-actions =
- (cond
- ((numberp val)
- (list (int-to-string val)
- 'insert-register
- 'increment-register))
- ((markerp val)
- (let ((buf (marker-buffer val)))
- (if (null buf)
- (list "a marker in no buffer")
- (list (concat
- "a buffer position:"
- (buffer-name buf)
- ", position "
- (int-to-string (marker-position val)))
- 'jump-to-register
- 'insert-register))))
- ((and (consp val) (window-configuration-p (car val)))
- (list "window configuration."
- 'jump-to-register))
- ((and (vectorp val)
- (fboundp 'undo-tree-register-data-p)
- (undo-tree-register-data-p (elt val 1)))
- (list
- "Undo-tree entry."
- 'undo-tree-restore-state-from-register))
- ((or (and (vectorp val) (eq 'registerv (aref val 0)))
- (and (consp val) (frame-configuration-p (car val))))
- (list "frame configuration."
- 'jump-to-register))
- ((and (consp val) (eq (car val) 'file))
- (list (concat "file:"
- (prin1-to-string (cdr val))
- ".")
- 'jump-to-register))
- ((and (consp val) (eq (car val) 'file-query))
- (list (concat "file:a file-query reference: file "
- (car (cdr val))
- ", position "
- (int-to-string (car (cdr (cdr val))))
- ".")
- 'jump-to-register))
- ((consp val)
- (let ((lines (format "%4d" (length val))))
- (list (format "%s: %s\n" lines
- (truncate-string-to-width
- (mapconcat 'identity (list (car val))
- "^J") (- (window-width) 15)))
- 'insert-register)))
- ((stringp val)
- (list
- ;; without properties
- (concat (substring-no-properties
- val 0 (min (length val) helm-register-max-offset))
- (if (> (length val) helm-register-max-offset)
- "[...]" ""))
- 'insert-register
- 'append-to-register
- 'prepend-to-register)))
- unless (null string-actions) ; Fix Issue #1107.
- collect (cons (format "Register %3s:\n %s" key (car string-actions))
- (cons char (cdr string-actions)))))
-
-(defun helm-register-action-transformer (actions register-and-functions)
- "Decide actions by the contents of register."
- (cl-loop with transformer-actions = nil
- with func-actions =
- '((insert-register
- "Insert Register" .
- (lambda (c) (insert-register (car c))))
- (jump-to-register
- "Jump to Register" .
- (lambda (c) (jump-to-register (car c))))
- (append-to-register
- "Append Region to Register" .
- (lambda (c) (append-to-register
- (car c) (region-beginning) (region-end))))
- (prepend-to-register
- "Prepend Region to Register" .
- (lambda (c) (prepend-to-register
- (car c) (region-beginning) (region-end))))
- (increment-register
- "Increment Prefix Arg to Register" .
- (lambda (c) (increment-register
- helm-current-prefix-arg (car c))))
- (undo-tree-restore-state-from-register
- "Restore Undo-tree register"
- (lambda (c) (and (fboundp 'undo-tree-restore-state-from-register)
- (undo-tree-restore-state-from-register (car c))))))
- for func in (cdr register-and-functions)
- for cell = (assq func func-actions)
- when cell
- do (push (cdr cell) transformer-actions)
- finally return (append (nreverse transformer-actions) actions)))
-
-;;;###autoload
-(defun helm-mark-ring ()
- "Preconfigured `helm' for `helm-source-mark-ring'."
- (interactive)
- (helm :sources 'helm-source-mark-ring
- :resume 'noresume
- :buffer "*helm mark*"))
-
-;;;###autoload
-(defun helm-global-mark-ring ()
- "Preconfigured `helm' for `helm-source-global-mark-ring'."
- (interactive)
- (helm :sources 'helm-source-global-mark-ring
- :resume 'noresume
- :buffer "*helm global mark*"))
-
-;;;###autoload
-(defun helm-all-mark-rings ()
- "Preconfigured `helm' for `helm-source-global-mark-ring' and \
-`helm-source-mark-ring'."
- (interactive)
- (helm :sources '(helm-source-mark-ring
- helm-source-global-mark-ring)
- :resume 'noresume
- :buffer "*helm mark ring*"))
-
-;;;###autoload
-(defun helm-register ()
- "Preconfigured `helm' for Emacs registers."
- (interactive)
- (helm :sources 'helm-source-register
- :resume 'noresume
- :buffer "*helm register*"))
-
-;;;###autoload
-(defun helm-show-kill-ring ()
- "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."
- (interactive)
- (let ((enable-recursive-minibuffers t))
- (helm :sources helm-source-kill-ring
- :buffer "*helm kill ring*"
- :resume 'noresume
- :allow-nest t)))
-
-;;;###autoload
-(defun 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."
- (interactive)
- (helm :sources
- (helm-build-sync-source "Kmacro"
- :candidates (lambda ()
- (helm-fast-remove-dups
- (cons (kmacro-ring-head)
- kmacro-ring)
- :test 'equal))
- :multiline t
- :candidate-transformer
- (lambda (candidates)
- (cl-loop for c in candidates collect
- (propertize (help-key-description (car c) nil)
- 'helm-realvalue c)))
- :persistent-help "Execute kmacro"
- :help-message 'helm-kmacro-help-message
- :action
- (helm-make-actions
- "Execute kmacro (`C-u <n>' to execute <n> times)"
- (lambda (candidate)
- (interactive)
- ;; Move candidate on top of list for next use.
- (setq kmacro-ring (delete candidate kmacro-ring))
- (kmacro-push-ring)
- (kmacro-split-ring-element candidate)
- (kmacro-exec-ring-item
- candidate helm-current-prefix-arg))))
- :buffer "*helm kmacro*"))
-
-(provide 'helm-ring)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-ring.el ends here
+++ /dev/null
-;;; helm-semantic.el --- Helm interface for Semantic -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Daniel Hackney <danNOSPAMhaxney.org>
-;; Author: Daniel Hackney <danNOSPAMhaxney.org>
-
-;; 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/>.
-
-;;; Commentary:
-
-;; Uses `candidates-in-buffer' for speed.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'semantic)
-(require 'helm-help)
-(require 'helm-imenu)
-
-(declare-function pulse-momentary-highlight-one-line "pulse.el" (point &optional face))
-
-(defgroup helm-semantic nil
- "Semantic tags related libraries and applications for helm."
- :group 'helm)
-
-(defcustom helm-semantic-lynx-style-map t
- "Use Arrow keys to jump to occurences."
- :group 'helm-semantic
- :type 'boolean)
-
-(defcustom helm-semantic-display-style
- '((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))
- "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."
- :group 'helm-semantic
- :type '(alist :key-type symbol :value-type symbol))
-
-;;; keymap
-(defvar helm-semantic-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (when helm-semantic-lynx-style-map
- (define-key map (kbd "<left>") 'helm-maybe-exit-minibuffer)
- (define-key map (kbd "<right>") 'helm-execute-persistent-action))
- (delq nil map)))
-
-;; Internals vars
-(defvar helm-semantic--tags-cache nil)
-
-(defun helm-semantic--fetch-candidates (tags depth &optional class)
- "Write the contents of TAGS to the current buffer."
- (let ((class class) cur-type
- (stylefn (or (with-helm-current-buffer
- (assoc-default major-mode helm-semantic-display-style))
- #'semantic-format-tag-summarize)))
- (cl-dolist (tag tags)
- (when (listp tag)
- (cl-case (setq cur-type (semantic-tag-class tag))
- ((function variable type)
- (let ((spaces (make-string (* depth 2) ?\s))
- (type-p (eq cur-type 'type)))
- (unless (and (> depth 0) (not type-p))
- (setq class nil))
- (insert
- (if (and class (not type-p))
- (format "%s%s(%s) "
- spaces (if (< depth 2) "" "├►") class)
- spaces)
- ;; Save the tag for later
- (propertize (funcall stylefn tag nil t)
- 'semantic-tag tag)
- "\n")
- (and type-p (setq class (car tag)))
- ;; Recurse to children
- (unless (eq cur-type 'function)
- (helm-semantic--fetch-candidates
- (semantic-tag-components tag) (1+ depth) class))))
-
- ;; Don't do anything with packages or includes for now
- ((package include)
- (insert
- (propertize (funcall stylefn tag nil t)
- 'semantic-tag tag)
- "\n")
- )
- ;; Catch-all
- (t))))))
-
-(defun helm-semantic-default-action (_candidate &optional persistent)
- ;; By default, helm doesn't pass on the text properties of the selection.
- ;; Fix this.
- (helm-log-run-hook 'helm-goto-line-before-hook)
- (with-current-buffer helm-buffer
- (when (looking-at " ")
- (goto-char (next-single-property-change
- (point-at-bol) 'semantic-tag nil (point-at-eol))))
- (let ((tag (get-text-property (point) 'semantic-tag)))
- (semantic-go-to-tag tag)
- (unless persistent
- (pulse-momentary-highlight-one-line (point))))))
-
-(defun helm-semantic--maybe-set-needs-update ()
- (with-helm-current-buffer
- (when (semantic-parse-tree-needs-update-p)
- (semantic-parse-tree-set-needs-update))))
-
-(defvar helm-source-semantic nil)
-
-(defclass helm-semantic-source (helm-source-in-buffer)
- ((init :initform (lambda ()
- (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)))))
- (get-line :initform 'buffer-substring)
- (persistent-help :initform "Show this entry")
- (keymap :initform 'helm-semantic-map)
- (help-message :initform 'helm-semantic-help-message)
- (persistent-action :initform (lambda (elm)
- (helm-semantic-default-action elm t)
- (helm-highlight-current-line)))
- (action :initform 'helm-semantic-default-action)))
-
-(defcustom helm-semantic-fuzzy-match nil
- "Enable fuzzy matching in `helm-source-semantic'."
- :group 'helm-semantic
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-semantic
- (helm-make-source "Semantic Tags" 'helm-semantic-source
- :fuzzy-match helm-semantic-fuzzy-match))))
-
-;;;###autoload
-(defun helm-semantic (arg)
- "Preconfigured `helm' for `semantic'.
-If ARG is supplied, pre-select symbol at point instead of current"
- (interactive "P")
- (let ((tag (helm-aif (semantic-current-tag-parent)
- (cons (format "\\_<%s\\_>" (car it))
- (format "\\_<%s\\_>" (car (semantic-current-tag))))
- (format "\\_<%s\\_>" (car (semantic-current-tag))))))
- (unless helm-source-semantic
- (setq helm-source-semantic
- (helm-make-source "Semantic Tags" 'helm-semantic-source
- :fuzzy-match helm-semantic-fuzzy-match)))
- (helm :sources 'helm-source-semantic
- :candidate-number-limit 9999
- :preselect (if arg
- (thing-at-point 'symbol)
- tag)
- :buffer "*helm semantic*")))
-
-;;;###autoload
-(defun 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."
- (interactive "P")
- (unless helm-source-semantic
- (setq helm-source-semantic
- (helm-make-source "Semantic Tags" 'helm-semantic-source
- :fuzzy-match helm-semantic-fuzzy-match)))
- (unless helm-source-imenu
- (setq helm-source-imenu
- (helm-make-source "Imenu" 'helm-imenu-source
- :fuzzy-match helm-imenu-fuzzy-match)))
- (let* ((source (if (semantic-active-p)
- 'helm-source-semantic
- 'helm-source-imenu))
- (imenu-p (eq source 'helm-source-imenu))
- (imenu-auto-rescan imenu-p)
- (helm-execute-action-at-once-if-one
- (and imenu-p
- helm-imenu-execute-action-at-once-if-one))
- (tag (helm-aif (semantic-current-tag-parent)
- (cons (format "\\_<%s\\_>" (car it))
- (format "\\_<%s\\_>" (car (semantic-current-tag))))
- (format "\\_<%s\\_>" (car (semantic-current-tag))))))
- (helm :sources source
- :candidate-number-limit 9999
- :preselect (if (or arg imenu-p)
- (thing-at-point 'symbol)
- tag)
- :buffer "*helm semantic/imenu*")))
-
-(provide 'helm-semantic)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-semantic.el ends here
+++ /dev/null
-;;; helm-sys.el --- System related functions for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-utils)
-
-\f
-(defgroup helm-sys nil
- "System related helm library."
- :group 'helm)
-
-(defface helm-top-columns
- '((t :inherit helm-header))
- "Face for helm help string in minibuffer."
- :group 'helm-sys)
-
-\f
-(defun helm-top-command-set-fn (var _value)
- (set var
- (cl-case system-type
- (darwin "env COLUMNS=%s ps -axo pid,user,pri,nice,ucomm,tty,start,vsz,%%cpu,%%mem,etime,command")
- (t "env COLUMNS=%s top -b -n 1"))))
-
-(defcustom helm-top-command "env COLUMNS=%s top -b -n 1"
- "Top command used to display output of top.
-To use top command, a version supporting batch mode (-b option) is needed.
-On Mac OSX top command doesn't support this, so ps command
-is used by default instead.
-If you modify this the number and order of elements displayed
-should be the same as top command to have the sort commands
-working properly, that is 12 elements with the 2 first being
-PID and USER and the last 4 being %CPU, %MEM, TIME and COMMAND.
-A format string where %s will be replaced with `frame-width'."
- :group 'helm-sys
- :type 'string
- :set 'helm-top-command-set-fn)
-
-\f
-;;; Top (process)
-;;
-;;
-(defvar helm-top-sort-fn nil)
-(defvar helm-top-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-P") 'helm-top-run-sort-by-cpu)
- (define-key map (kbd "M-C") 'helm-top-run-sort-by-com)
- (define-key map (kbd "M-M") 'helm-top-run-sort-by-mem)
- (define-key map (kbd "M-U") 'helm-top-run-sort-by-user)
- map))
-
-(defvar helm-source-top
- (helm-build-in-buffer-source "Top"
- :header-name (lambda (name) (concat name " (Press C-c C-u to refresh)"))
- :init #'helm-top-init
- :nomark t
- :display-to-real #'helm-top-display-to-real
- :persistent-action #'helm-top-sh-persistent-action
- :persistent-help "SIGTERM"
- :help-message 'helm-top-help-message
- :follow 'never
- :keymap helm-top-map
- :filtered-candidate-transformer #'helm-top-sort-transformer
- :action-transformer #'helm-top-action-transformer))
-
-(defun helm-top-transformer (candidates _source)
- "Transformer for `helm-top'.
-Return empty string for non--valid candidates."
- (cl-loop for disp in candidates collect
- (cond ((string-match "^ *[0-9]+" disp) disp)
- ((string-match "^ *PID" disp)
- (cons (propertize disp 'face 'helm-top-columns) ""))
- (t (cons disp "")))))
-
-(defun helm-top-action-transformer (actions _candidate)
- "Action transformer for `top'.
-Show actions only on line starting by a PID."
- (let ((disp (helm-get-selection nil t)))
- (cond ((string-match "^ *[0-9]+" disp)
- (list '("kill (SIGTERM)" . (lambda (pid) (helm-top-sh "TERM" pid)))
- '("kill (SIGKILL)" . (lambda (pid) (helm-top-sh "KILL" pid)))
- '("kill (SIGINT)" . (lambda (pid) (helm-top-sh "INT" pid)))
- '("kill (Choose signal)"
- . (lambda (pid)
- (helm-top-sh
- (helm-comp-read (format "Kill [%s] with signal: " pid)
- '("ALRM" "HUP" "INT" "KILL" "PIPE" "POLL"
- "PROF" "TERM" "USR1" "USR2" "VTALRM"
- "STKFLT" "PWR" "WINCH" "CHLD" "URG"
- "TSTP" "TTIN" "TTOU" "STOP" "CONT"
- "ABRT" "FPE" "ILL" "QUIT" "SEGV"
- "TRAP" "SYS" "EMT" "BUS" "XCPU" "XFSZ")
- :must-match t)
- pid)))))
- (t actions))))
-
-(defun helm-top-sh (sig pid)
- "Run kill shell command with signal SIG on PID for `helm-top'."
- (let ((cmd (format "kill -%s %s" sig pid)))
- (message "Executed %s\n%s" cmd (shell-command-to-string cmd))))
-
-(defun helm-top-sh-persistent-action (pid)
- (delete-other-windows)
- (helm-top-sh "TERM" pid)
- (helm-force-update))
-
-(defun helm-top-init ()
- "Insert output of top command in candidate buffer."
- (unless helm-top-sort-fn (helm-top-set-mode-line "CPU"))
- (with-current-buffer (helm-candidate-buffer 'global)
- (call-process-shell-command
- (format helm-top-command (frame-width))
- nil (current-buffer))))
-
-(defun helm-top-display-to-real (line)
- "Return pid only from LINE."
- (car (split-string line)))
-
-;; Sort top command
-
-(defun helm-top-set-mode-line (str)
- (if (string-match "Sort:\\[\\(.*\\)\\] " helm-top-mode-line)
- (setq helm-top-mode-line (replace-match str nil nil helm-top-mode-line 1))
- (setq helm-top-mode-line (concat (format "Sort:[%s] " str) helm-top-mode-line))))
-
-(defun helm-top-sort-transformer (candidates source)
- (helm-top-transformer
- (if helm-top-sort-fn
- (cl-loop for c in candidates
- if (string-match "^ *[0-9]+" c)
- collect c into pid-cands
- else collect c into header-cands
- finally return (append
- header-cands
- (sort pid-cands helm-top-sort-fn)))
- candidates)
- source))
-
-(defun helm-top-sort-by-com (s1 s2)
- (let* ((split-1 (split-string s1))
- (split-2 (split-string s2))
- (com-1 (nth 11 split-1))
- (com-2 (nth 11 split-2)))
- (string< com-1 com-2)))
-
-(defun helm-top-sort-by-mem (s1 s2)
- (let* ((split-1 (split-string s1))
- (split-2 (split-string s2))
- (mem-1 (string-to-number (nth 9 split-1)))
- (mem-2 (string-to-number (nth 9 split-2))))
- (> mem-1 mem-2)))
-
-(defun helm-top-sort-by-user (s1 s2)
- (let* ((split-1 (split-string s1))
- (split-2 (split-string s2))
- (user-1 (nth 1 split-1))
- (user-2 (nth 1 split-2)))
- (string< user-1 user-2)))
-
-(defun helm-top-run-sort-by-com ()
- (interactive)
- (helm-top-set-mode-line "COM")
- (setq helm-top-sort-fn 'helm-top-sort-by-com)
- (helm-force-update))
-
-(defun helm-top-run-sort-by-cpu ()
- (interactive)
- (helm-top-set-mode-line "CPU")
- (setq helm-top-sort-fn nil)
- (helm-force-update))
-
-(defun helm-top-run-sort-by-mem ()
- (interactive)
- (helm-top-set-mode-line "MEM")
- (setq helm-top-sort-fn 'helm-top-sort-by-mem)
- (helm-force-update))
-
-(defun helm-top-run-sort-by-user ()
- (interactive)
- (helm-top-set-mode-line "USER")
- (setq helm-top-sort-fn 'helm-top-sort-by-user)
- (helm-force-update))
-
-\f
-;;; X RandR resolution change
-;;
-;;
-;;; FIXME I do not care multi-display.
-
-(defun helm-xrandr-info ()
- "Return a pair with current X screen number and current X display name."
- (with-temp-buffer
- (call-process "xrandr" nil (current-buffer) nil
- "--current")
- (let (screen output)
- (goto-char (point-min))
- (save-excursion
- (when (re-search-forward "\\(^Screen \\)\\([0-9]\\):" nil t)
- (setq screen (match-string 2))))
- (when (re-search-forward "^\\(.*\\) connected" nil t)
- (setq output (match-string 1)))
- (list screen output))))
-
-(defun helm-xrandr-screen ()
- "Return current X screen number."
- (car (helm-xrandr-info)))
-
-(defun helm-xrandr-output ()
- "Return current X display name."
- (cadr (helm-xrandr-info)))
-
-(defvar helm-source-xrandr-change-resolution
- '((name . "Change Resolution")
- (candidates
- . (lambda ()
- (with-temp-buffer
- (call-process "xrandr" nil (current-buffer) nil
- "--screen" (helm-xrandr-screen) "-q")
- (goto-char 1)
- (cl-loop with modes = nil
- while (re-search-forward " \\([0-9]+x[0-9]+\\)" nil t)
- for mode = (match-string 1)
- unless (member mode modes)
- collect mode into modes
- finally return modes))))
- (action
- ("Change Resolution"
- . (lambda (mode)
- (call-process "xrandr" nil nil nil
- "--screen" (helm-xrandr-screen)
- "--output" (helm-xrandr-output)
- "--mode" mode))))))
-
-\f
-;;; Emacs process
-;;
-;;
-(defvar helm-source-emacs-process
- '((name . "Emacs Process")
- (init . (lambda () (list-processes--refresh)))
- (candidates . (lambda () (mapcar #'process-name (process-list))))
- (persistent-action . (lambda (elm)
- (delete-process (get-process elm))
- (helm-delete-current-selection)))
- (persistent-help . "Kill Process")
- (action ("Kill Process" . (lambda (elm)
- (delete-process (get-process elm)))))))
-
-\f
-;;;###autoload
-(defun helm-top ()
- "Preconfigured `helm' for top command."
- (interactive)
- (save-window-excursion
- (unless helm-alive-p (delete-other-windows))
- (helm :sources 'helm-source-top
- :buffer "*helm top*" :full-frame t
- :candidate-number-limit 9999
- :preselect "^\\s-*[0-9]+")))
-
-;;;###autoload
-(defun helm-list-emacs-process ()
- "Preconfigured `helm' for emacs process."
- (interactive)
- (helm-other-buffer 'helm-source-emacs-process "*helm process*"))
-
-;;;###autoload
-(defun helm-xrandr-set ()
- "Preconfigured helm for xrandr."
- (interactive)
- (helm :sources 'helm-source-xrandr-change-resolution
- :buffer "*helm xrandr*"))
-
-(provide 'helm-sys)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-sys.el ends here
+++ /dev/null
-;;; helm-tags.el --- Helm for Etags. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-utils)
-(require 'helm-grep)
-
-\f
-(defgroup helm-tags nil
- "Tags related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-etags-tag-file-name "TAGS"
- "Etags tag file name."
- :type 'string
- :group 'helm-tags)
-
-(defcustom helm-etags-tag-file-search-limit 10
- "The limit level of directory to search tag file.
-Don't search tag file deeply if outside this value."
- :type 'number
- :group 'helm-tags)
-
-(defcustom helm-etags-match-part-only '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 only end part of tag (i.e \"foo\"),
-against only the tag part (i.e \"(defun foo\"),
-or against the whole candidate (i.e \"(filename: (defun foo\")."
- :type '(choice
- (const :tag "Match only tag" tag)
- (const :tag "Match last part of tag" endtag)
- (const :tag "Match all file+tag" all))
- :group 'helm-tags)
-
-(defcustom helm-etags-execute-action-at-once-if-one t
- "Whether to jump straight to the selected tag if there's only
-one match."
- :type 'boolean
- :group 'helm-tags)
-
-\f
-(defgroup helm-tags-faces nil
- "Customize the appearance of helm-tags faces."
- :prefix "helm-"
- :group 'helm-tags
- :group 'helm-faces)
-
-(defface helm-etags-file
- '((t (:foreground "Lightgoldenrod4"
- :underline t)))
- "Face used to highlight etags filenames."
- :group 'helm-tags-faces)
-
-\f
-;;; Etags
-;;
-;;
-(defun helm-etags-run-switch-other-window ()
- "Run switch to other window action from `helm-source-etags-select'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- (lambda (c)
- (helm-etags-action-goto 'find-file-other-window c)))))
-
-(defun helm-etags-run-switch-other-frame ()
- "Run switch to other frame action from `helm-source-etags-select'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- (lambda (c)
- (helm-etags-action-goto 'find-file-other-frame c)))))
-
-(defvar helm-etags-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-goto-next-file)
- (define-key map (kbd "M-<up>") 'helm-goto-precedent-file)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- (define-key map (kbd "C-c o") 'helm-etags-run-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-etags-run-switch-other-frame)
- map)
- "Keymap used in Etags.")
-
-(defvar helm-etags-mtime-alist nil
- "Store the last modification time of etags files here.")
-(defvar helm-etags-cache (make-hash-table :test 'equal)
- "Cache content of etags files used here for faster access.")
-
-(defun helm-etags-get-tag-file (&optional directory)
- "Return the path of etags file if found.
-Lookes recursively in parents directorys for a
-`helm-etags-tag-file-name' file."
- ;; Get tag file from `default-directory' or upper directory.
- (let ((current-dir (helm-etags-find-tag-file-directory
- (or directory default-directory))))
- ;; Return nil if not find tag file.
- (when current-dir
- (expand-file-name helm-etags-tag-file-name current-dir))))
-
-(defun helm-etags-all-tag-files ()
- "Return files from the following sources;
- 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."
- (helm-fast-remove-dups
- (delq nil
- (append (list (helm-etags-get-tag-file)
- tags-file-name)
- tags-table-list))
- :test 'equal))
-
-(defun helm-etags-find-tag-file-directory (current-dir)
- "Try to find the directory containing tag file.
-If not found in CURRENT-DIR search in upper directory."
- (let ((file-exists? (lambda (dir)
- (let ((tag-path (expand-file-name
- helm-etags-tag-file-name dir)))
- (and (stringp tag-path)
- (file-regular-p tag-path)
- (file-readable-p tag-path))))))
- (cl-loop with count = 0
- until (funcall file-exists? current-dir)
- ;; Return nil if outside the value of
- ;; `helm-etags-tag-file-search-limit'.
- if (= count helm-etags-tag-file-search-limit)
- do (cl-return nil)
- ;; Or search upper directories.
- else
- do (cl-incf count)
- (setq current-dir (expand-file-name (concat current-dir "../")))
- finally return current-dir)))
-
-(defun helm-etags-get-header-name (_x)
- "Create header name for this helm etags session."
- (concat "Etags in "
- (with-helm-current-buffer
- (helm-etags-get-tag-file))))
-
-(defun helm-etags-create-buffer (file)
- "Create the `helm-buffer' based on contents of etags tag FILE."
- (let* ((tag-fname file)
- max
- (split (with-current-buffer (find-file-noselect tag-fname)
- (prog1
- (split-string (buffer-string) "\n" 'omit-nulls)
- (setq max (line-number-at-pos (point-max)))
- (kill-buffer))))
- (progress-reporter (make-progress-reporter "Loading tag file..." 0 max)))
- (cl-loop
- with fname
- with cand
- for i in split for count from 0
- for elm = (unless (string-match "^\x0c" i) ;; "^L"
- (helm-aif (string-match "\177" i) ;; "^?"
- (substring i 0 it)
- i))
- for linum = (when (string-match "[0-9]+,?[0-9]*$" i)
- (car (split-string (match-string 0 i) ",")))
- do (cond ((and elm (string-match "^\\([^,]+\\),[0-9]+$" elm))
- (setq fname (propertize (match-string 1 elm)
- 'face 'helm-etags-file)))
- (elm (setq cand (format "%s:%s:%s" fname linum elm)))
- (t (setq cand nil)))
- when cand do (progn
- (insert (propertize (concat cand "\n") 'linum linum))
- (progress-reporter-update progress-reporter count)))))
-
-(defun helm-etags-init ()
- "Feed `helm-buffer' using `helm-etags-cache' or tag file.
-If no entry in cache, create one."
- (let ((tagfiles (helm-etags-all-tag-files)))
- (when tagfiles
- (with-current-buffer (helm-candidate-buffer 'global)
- (dolist (f tagfiles)
- (helm-aif (gethash f helm-etags-cache)
- ;; An entry is present in cache, insert it.
- (insert it)
- ;; No entry, create a new buffer using content of tag file (slower).
- (helm-etags-create-buffer f)
- ;; Store content of buffer in cache.
- (puthash f (buffer-string) helm-etags-cache)
- ;; Store or set the last modification of tag file.
- (helm-aif (assoc f helm-etags-mtime-alist)
- ;; If an entry exists modify it.
- (setcdr it (helm-etags-mtime f))
- ;; No entry create a new one.
- (add-to-list 'helm-etags-mtime-alist
- (cons f (helm-etags-mtime f))))))))))
-
-(defvar helm-source-etags-select nil
- "Helm source for Etags.")
-
-(defun helm-etags-build-source ()
- (helm-build-in-buffer-source "Etags"
- :header-name 'helm-etags-get-header-name
- :init 'helm-etags-init
- :get-line 'buffer-substring
- :match-part (lambda (candidate)
- ;; Match only the tag part of CANDIDATE
- ;; and not the filename.
- (cl-ecase helm-etags-match-part-only
- (endtag (cadr (split-string
- (cl-caddr (helm-grep-split-line candidate)))))
- (tag (cl-caddr (helm-grep-split-line candidate)))
- (all candidate)))
- :fuzzy-match helm-etags-fuzzy-match
- :help-message 'helm-etags-help-message
- :keymap helm-etags-map
- :action '(("Go to tag" . (lambda (c)
- (helm-etags-action-goto 'find-file c)))
- ("Go to tag in other window" . (lambda (c)
- (helm-etags-action-goto
- 'find-file-other-window
- c)))
- ("Go to tag in other frame" . (lambda (c)
- (helm-etags-action-goto
- 'find-file-other-frame
- c))))
- :persistent-help "Go to line"
- :persistent-action (lambda (candidate)
- (helm-etags-action-goto 'find-file candidate)
- (helm-highlight-current-line))))
-
-(defcustom helm-etags-fuzzy-match nil
- "Use fuzzy matching in `helm-etags-select'."
- :group 'helm-tags
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-etags-select
- (helm-etags-build-source))))
-
-(defvar find-tag-marker-ring)
-
-(defun helm-etags-action-goto (switcher candidate)
- "Helm default action to jump to an etags entry in other window."
- (require 'etags)
- (helm-log-run-hook 'helm-goto-line-before-hook)
- (let* ((split (helm-grep-split-line candidate))
- (fname (cl-loop for tagf being the hash-keys of helm-etags-cache
- for f = (expand-file-name
- (car split) (file-name-directory tagf))
- when (file-exists-p f)
- return f))
- (elm (cl-caddr split))
- (linum (string-to-number (cadr split))))
- (if (null fname)
- (error "file %s not found" fname)
- (ring-insert find-tag-marker-ring (point-marker))
- (funcall switcher fname)
- (helm-goto-line linum t)
- (when (search-forward elm nil t)
- (goto-char (match-beginning 0))))))
-
-(defun helm-etags-mtime (file)
- "Last modification time of etags tag FILE."
- (cadr (nth 5 (file-attributes file))))
-
-(defun helm-etags-file-modified-p (file)
- "Check if tag FILE have been modified in this session.
-If FILE is nil return nil."
- (let ((last-modif (and file
- (assoc-default file helm-etags-mtime-alist))))
- (and last-modif
- (/= last-modif (helm-etags-mtime file)))))
-
-;;;###autoload
-(defun 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."
- (interactive "P")
- (let ((tag-files (helm-etags-all-tag-files))
- (helm-execute-action-at-once-if-one
- helm-etags-execute-action-at-once-if-one)
- (str (if (region-active-p)
- (buffer-substring-no-properties
- (region-beginning) (region-end))
- ;; Use a raw syntax-table to determine tap.
- ;; This may be wrong when calling etags
- ;; with hff from a buffer that use
- ;; a different syntax, but most of the time it
- ;; should be better.
- (with-syntax-table (standard-syntax-table)
- (thing-at-point 'symbol)))))
- (if (cl-notany 'file-exists-p tag-files)
- (message "Error: No tag file found.\
-Create with etags shell command, or visit with `find-tag' or `visit-tags-table'.")
- (cl-loop for k being the hash-keys of helm-etags-cache
- unless (member k tag-files)
- do (remhash k helm-etags-cache))
- (mapc (lambda (f)
- (when (or (equal reinit '(4))
- (and helm-etags-mtime-alist
- (helm-etags-file-modified-p f)))
- (remhash f helm-etags-cache)))
- tag-files)
- (unless helm-source-etags-select
- (setq helm-source-etags-select
- (helm-etags-build-source)))
- (helm :sources 'helm-source-etags-select
- :keymap helm-etags-map
- :default (if helm-etags-fuzzy-match
- str
- (list (concat "\\_<" str "\\_>") str))
- :buffer "*helm etags*"))))
-
-(provide 'helm-tags)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-tags.el ends here
+++ /dev/null
-;;; helm-types.el --- Helm types classes and methods. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.com>
-
-;; Author: Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.com>
-;; URL: http://github.com/emacs-helm/helm
-
-;; 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 'cl-lib)
-(require 'eieio)
-
-\f
-;; Files
-(defclass helm-type-file (helm-source) ()
- "A class to define helm type file.")
-
-(defmethod helm-source-get-action-from-type ((object helm-type-file))
- (slot-value object 'action))
-
-(defun helm-actions-from-type-file ()
- (let ((source (make-instance 'helm-type-file)))
- (helm--setup-source source)
- (helm-source-get-action-from-type source)))
-
-(defcustom helm-type-file-actions
- (helm-make-actions
- "Find file" 'helm-find-many-files
- "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
- "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
- "Etags `M-., C-u reload tag file'" 'helm-ff-etags-select
- "View file" 'view-file
- "Insert file" 'insert-file
- "Add marked files to file-cache" 'helm-ff-cache-add-file
- "Delete file(s)" 'helm-delete-marked-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)
- "Default actions for type files."
- :group 'helm-files
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm--setup-source :primary ((_source helm-type-file)))
-
-(defmethod helm--setup-source :before ((source helm-type-file))
- (set-slot-value source 'action 'helm-type-file-actions)
- (set-slot-value source 'persistent-help "Show this file")
- (set-slot-value source 'action-transformer '(helm-transform-file-load-el
- helm-transform-file-browse-url
- helm-transform-file-cache))
- (set-slot-value source 'candidate-transformer '(helm-skip-boring-files
- helm-highlight-files
- helm-w32-pathname-transformer)))
-\f
-;; Bookmarks
-(defclass helm-type-bookmark (helm-source) ()
- "A class to define type bookmarks.")
-
-(defcustom helm-type-bookmark-actions
- (helm-make-actions
- "Jump to bookmark" 'helm-bookmark-jump
- "Jump to BM other window" 'helm-bookmark-jump-other-window
- "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)
- "Default actions for type bookmarks."
- :group 'helm-bookmark
- :type '(alist :key-type string
- :value-type function))
-
-(defmethod helm-source-get-action-from-type ((object helm-type-bookmark))
- (slot-value object 'action))
-
-(defmethod helm--setup-source :primary ((_source helm-type-bookmark)))
-
-(defmethod helm--setup-source :before ((source helm-type-bookmark))
- (set-slot-value source 'action 'helm-type-bookmark-actions)
- (set-slot-value source 'keymap helm-bookmark-map)
- (set-slot-value source 'help-message 'helm-bookmark-help-message)
- (set-slot-value source 'migemo t))
-
-\f
-;; Buffers
-(defclass helm-type-buffer (helm-source) ()
- "A class to define type buffer.")
-
-(defcustom helm-type-buffer-actions
- (helm-make-actions
- "Switch to buffer(s)" 'helm-switch-to-buffers
- (lambda () (and (locate-library "popwin")
- "Switch to buffer in popup window"))
- 'popwin:popup-buffer
- "Switch to buffer(s) other window `C-c o'"
- 'helm-switch-to-buffers-other-window
- "Switch to buffer other frame `C-c C-o'"
- 'switch-to-buffer-other-frame
- (lambda () (and (locate-library "elscreen")
- "Display buffer in Elscreen"))
- 'helm-find-buffer-on-elscreen
- "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
- "Grep buffers `M-g s' (C-u grep all buffers)"
- 'helm-zgrep-buffers
- "Multi occur buffer(s) `C-s'" 'helm-multi-occur-as-action
- "Revert buffer(s) `M-U'" '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-='"
- (lambda (candidate)
- (helm-ediff-marked-buffers candidate t)))
- "Default actions for type buffers."
- :group 'helm-buffers
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm-source-get-action-from-type ((object helm-type-buffer))
- (slot-value object 'action))
-
-(defmethod helm--setup-source :primary ((_source helm-type-buffer)))
-
-(defmethod helm--setup-source :before ((source helm-type-buffer))
- (set-slot-value source 'action 'helm-type-buffer-actions)
- (set-slot-value source 'persistent-help "Show this buffer")
- (set-slot-value
- source 'filtered-candidate-transformer
- '(helm-skip-boring-buffers
- helm-buffers-sort-transformer
- helm-highlight-buffers)))
-\f
-;; Functions
-(defclass helm-type-function (helm-source) ()
- "A class to define helm type function.")
-
-(defcustom helm-type-function-actions
- (helm-make-actions
- "Describe command" 'describe-function
- "Add command to kill ring" 'helm-kill-new
- "Go to command's definition" 'find-function
- "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)
- "Default actions for type functions."
- :group 'helm-elisp
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm-source-get-action-from-type ((object helm-type-function))
- (slot-value object 'action))
-
-(defun helm-actions-from-type-function ()
- (let ((source (make-instance 'helm-type-function)))
- (helm--setup-source source)
- (helm-source-get-action-from-type source)))
-
-(defmethod helm--setup-source :primary ((_source helm-type-function)))
-
-(defmethod helm--setup-source :before ((source helm-type-function))
- (set-slot-value source 'action 'helm-type-function-actions)
- (set-slot-value source 'action-transformer
- 'helm-transform-function-call-interactively)
- (set-slot-value source 'candidate-transformer
- 'helm-mark-interactive-functions)
- (set-slot-value source 'coerce 'helm-symbolify))
-
-\f
-;; Commands
-(defclass helm-type-command (helm-source) ()
- "A class to define helm type command.")
-
-(defun helm-actions-from-type-command ()
- (let ((source (make-instance 'helm-type-command)))
- (helm--setup-source source)
- (helm-source-get-action-from-type source)))
-
-(defcustom helm-type-command-actions
- (append (helm-make-actions
- "Call interactively" 'helm-call-interactively)
- (helm-actions-from-type-function))
- "Default actions for type command."
- :group 'helm-command
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm--setup-source :primary ((_source helm-type-command)))
-
-(defmethod helm--setup-source :before ((source helm-type-command))
- (set-slot-value
- source 'action 'helm-type-command-actions)
- (set-slot-value source 'coerce 'helm-symbolify)
- (set-slot-value source 'persistent-action 'describe-function))
-
-;; Timers
-(defclass helm-type-timers (helm-source) ()
- "A class to define helm type timers.")
-
-(defcustom helm-type-timers-actions
- '(("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 (byte-code-function-p it)
- (message "Can't find anonymous function `%s'" it)
- (find-function it))))))
- "Default actions for type timers."
- :group 'helm-elisp
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm--setup-source :primary ((_source helm-type-timers)))
-
-(defmethod helm--setup-source :before ((source helm-type-timers))
- (set-slot-value source 'action 'helm-type-timers-actions)
- (set-slot-value source 'persistent-action
- (lambda (tm)
- (describe-function (timer--function tm))))
- (set-slot-value source 'persistent-help "Describe Function"))
-\f
-;; Builders.
-(defun helm-build-type-file ()
- (helm-make-type 'helm-type-file))
-
-(defun helm-build-type-function ()
- (helm-make-type 'helm-type-function))
-
-(defun helm-build-type-command ()
- (helm-make-type 'helm-type-command))
-
-(provide 'helm-types)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-types.el ends here
+++ /dev/null
-;;; helm-utils.el --- Utilities Functions for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'compile) ; Fixme: Is this needed?
-(require 'dired)
-
-(declare-function helm-find-files-1 "helm-files.el" (fname &optional preselect))
-(defvar winner-boring-buffers)
-
-\f
-(defgroup helm-utils nil
- "Utilities routines for Helm."
- :group 'helm)
-
-(defcustom helm-su-or-sudo "sudo"
- "What command to use for root access."
- :type 'string
- :group 'helm-utils)
-
-(defcustom helm-default-kbsize 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."
- :group 'helm-utils
- :type 'float)
-
-(defcustom helm-highlight-number-lines-around-point 15
- "Number of lines around point where matched items are highlighted."
- :group 'helm-utils
- :type 'integer)
-
-(defcustom helm-buffers-to-resize-on-pa nil
- "A list of helm buffers where the helm-window should be reduced on persistent actions."
- :group 'helm-utils
- :type '(repeat (choice string)))
-
-(defcustom helm-resize-on-pa-text-height 12
- "The size of the helm-window when resizing on persistent action."
- :group 'helm-utils
- :type 'integer)
-
-\f
-(defvar helm-goto-line-before-hook '(helm-save-current-pos-to-mark-ring)
- "Run before jumping to line.
-This hook run when jumping from `helm-goto-line', `helm-etags-default-action',
-and `helm-imenu-default-action'.
-This allow 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 instead (or adding) `helm-save-pos-to-register-before-jump'.
-In this case last position is added to the register
-`helm-save-pos-before-jump-register'.")
-
-(defvar helm-save-pos-before-jump-register ?_
- "The register where `helm-save-pos-to-register-before-jump' save position.")
-
-\f
-;;; Faces.
-;;
-(defface helm-selection-line
- '((t (:inherit highlight :distant-foreground "black")))
- "Face used in the `helm-current-buffer' when jumping to candidate."
- :group 'helm-faces)
-
-(defface helm-match-item
- '((t (:inherit isearch)))
- "Face used to highlight item matched in a selected line."
- :group 'helm-faces)
-
-\f
-;; CUA workaround
-(defadvice cua-delete-region (around helm-avoid-cua activate)
- (ignore-errors ad-do-it))
-
-(defadvice copy-region-as-kill (around helm-avoid-cua activate)
- (if cua-mode
- (ignore-errors ad-do-it)
- ad-do-it))
-
-\f
-;;; Utils functions
-;;
-;;
-(defun helm-switch-to-buffers (buffer-or-name &optional other-window)
- "Switch to buffer BUFFER-OR-NAME.
-If more than one buffer marked switch to these buffers in separate windows.
-If OTHER-WINDOW is specified keep current-buffer and switch to others buffers
-in separate windows."
- (let* ((mkds (helm-marked-candidates))
- (size (/ (window-height) (length mkds))))
- (or (<= window-min-height size)
- (error "Too many buffers to visit simultaneously."))
- (helm-aif (cdr mkds)
- (progn
- (if other-window
- (switch-to-buffer-other-window (car mkds))
- (switch-to-buffer (car mkds)))
- (save-selected-window
- (cl-loop for b in it
- do (progn
- (select-window (split-window))
- (switch-to-buffer b)))))
- (if other-window
- (switch-to-buffer-other-window buffer-or-name)
- (switch-to-buffer buffer-or-name)))))
-
-(defun helm-switch-to-buffers-other-window (buffer-or-name)
- "switch to buffer BUFFER-OR-NAME in other window.
-See `helm-switch-to-buffers' for switching to marked buffers."
- (helm-switch-to-buffers buffer-or-name t))
-
-(cl-defun helm-current-buffer-narrowed-p (&optional
- (buffer helm-current-buffer))
- "Check if BUFFER is narrowed.
-Default is `helm-current-buffer'."
- (with-current-buffer buffer
- (let ((beg (point-min))
- (end (point-max))
- (total (buffer-size)))
- (or (/= beg 1) (/= end (1+ total))))))
-
-(defun helm-goto-char (loc)
- "Go to char, revealing if necessary."
- (goto-char loc)
- (when (or (eq major-mode 'org-mode)
- (and (boundp 'outline-minor-mode)
- outline-minor-mode))
- (require 'org) ; On some old Emacs versions org may not be loaded.
- (org-reveal)))
-
-(defun helm-goto-line (lineno &optional noanim)
- "Goto LINENO opening only outline headline if needed.
-Animation is used unless NOANIM is non--nil."
- (helm-log-run-hook 'helm-goto-line-before-hook)
- (goto-char (point-min))
- (helm-goto-char (point-at-bol lineno))
- (unless noanim
- (helm-highlight-current-line nil nil nil nil 'pulse)))
-
-(defun helm-save-pos-to-register-before-jump ()
- "Save current buffer position to `helm-save-pos-before-jump-register'.
-To use this add it to `helm-goto-line-before-hook'."
- (with-helm-current-buffer
- (unless helm-in-persistent-action
- (point-to-register helm-save-pos-before-jump-register))))
-
-(defun helm-save-current-pos-to-mark-ring ()
- "Save current buffer position to mark ring.
-To use this add it to `helm-goto-line-before-hook'."
- (with-helm-current-buffer
- (unless helm-in-persistent-action
- (set-marker (mark-marker) (point))
- (push-mark (point) 'nomsg))))
-
-;;;###autoload
-(defun helm-show-all-in-this-source-only (arg)
- "Show only current source of this helm session with all its candidates.
-With a numeric prefix arg show only the ARG number of candidates."
- (interactive "p")
- (with-helm-window
- (with-helm-default-directory (helm-default-directory)
- (let ((helm-candidate-number-limit (and (> arg 1) arg)))
- (helm-set-source-filter
- (list (assoc-default 'name (helm-get-current-source))))))))
-
-;;;###autoload
-(defun helm-display-all-sources ()
- "Display all sources previously hidden by `helm-set-source-filter'."
- (interactive)
- (helm-set-source-filter nil))
-
-(defun helm-displaying-source-names ()
- "Return the list of sources name for this helm session."
- (with-current-buffer helm-buffer
- (goto-char (point-min))
- (cl-loop with pos
- while (setq pos (next-single-property-change (point) 'helm-header))
- do (goto-char pos)
- collect (buffer-substring-no-properties (point-at-bol)(point-at-eol))
- do (forward-line 1))))
-
-(defun helm-handle-winner-boring-buffers ()
- "Add `helm-buffer' to `winner-boring-buffers' when quitting/exiting helm.
-Add this function to `helm-cleanup-hook' when you don't want to see helm buffers
-after running winner-undo/redo."
- (require 'winner)
- (cl-pushnew helm-buffer winner-boring-buffers :test 'equal))
-(add-hook 'helm-cleanup-hook #'helm-handle-winner-boring-buffers)
-
-;;;###autoload
-(defun 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."
- (interactive)
- (require 'helm-grep)
- (helm-run-after-exit
- (lambda (f)
- (if (file-exists-p f)
- (helm-find-files-1 (file-name-directory f)
- (concat
- "^"
- (regexp-quote
- (if helm-ff-transformer-show-only-basename
- (helm-basename f) f))))
- (helm-find-files-1 f)))
- (let* ((sel (helm-get-selection))
- (grep-line (and (stringp sel)
- (helm-grep-split-line sel)))
- (bmk-name (and (stringp sel)
- (not grep-line)
- (replace-regexp-in-string "\\`\\*" "" sel)))
- (bmk (and bmk-name (assoc bmk-name bookmark-alist)))
- (buf (helm-aif (and (bufferp sel) (get-buffer sel))
- (buffer-name it)))
- (default-preselection (or (buffer-file-name helm-current-buffer)
- default-directory)))
- (cond
- ;; Buffer.
- (buf (or (buffer-file-name sel)
- (car (rassoc buf dired-buffers))
- (and (with-current-buffer buf
- (eq major-mode 'org-agenda-mode))
- org-directory
- (expand-file-name org-directory))
- (with-current-buffer buf default-directory)))
- ;; Bookmark.
- (bmk (helm-aif (bookmark-get-filename bmk)
- (if (and ffap-url-regexp
- (string-match ffap-url-regexp it))
- it (expand-file-name it))
- default-directory))
- ((or (file-remote-p sel)
- (file-exists-p sel))
- (expand-file-name sel))
- ;; Grep.
- ((and grep-line (file-exists-p (car grep-line)))
- (expand-file-name (car grep-line)))
- ;; Occur.
- (grep-line
- (with-current-buffer (get-buffer (car grep-line))
- (or (buffer-file-name) default-directory)))
- ;; Url.
- ((and ffap-url-regexp (string-match ffap-url-regexp sel)) sel)
- ;; Default.
- (t default-preselection)))))
-
-(defun helm-generic-sort-fn (s1 s2)
- "Sort predicate function for helm candidates.
-Args S1 and S2 can be single or \(display . real\) candidates,
-that is sorting is done against real value of candidate."
- (let* ((pattern (regexp-quote helm-pattern))
- (reg1 (concat "\\_<" pattern "\\_>"))
- (reg2 (concat "\\_<" pattern))
- (reg3 helm-pattern)
- (split (split-string pattern))
- (str1 (if (consp s1) (cdr s1) s1))
- (str2 (if (consp s2) (cdr s2) s2))
- (score (lambda (str r1 r2 r3 lst)
- (+ (if (string-match (concat "\\`" pattern) str) 1 0)
- (cond ((string-match r1 str) 5)
- ((and (string-match " " pattern)
- (string-match (concat "\\_<" (car lst)) str)
- (cl-loop for r in (cdr lst)
- always (string-match r str))) 4)
- ((and (string-match " " pattern)
- (cl-loop for r in lst always (string-match r str))) 3)
- ((string-match r2 str) 2)
- ((string-match r3 str) 1)
- (t 0)))))
- (sc1 (funcall score str1 reg1 reg2 reg3 split))
- (sc2 (funcall score str2 reg1 reg2 reg3 split)))
- (cond ((or (zerop (string-width pattern))
- (and (zerop sc1) (zerop sc2)))
- (string-lessp str1 str2))
- ((= sc1 sc2)
- (< (length str1) (length str2)))
- (t (> sc1 sc2)))))
-
-(defun helm-ff-get-host-from-tramp-invalid-fname (fname)
- "Extract hostname from an incomplete tramp file name.
-Return nil on valid file name remote or not."
- (let* ((str (helm-basename fname))
- (split (split-string str ":"))
- (meth (car (member (car split) (mapcar 'car tramp-methods)))))
- (when (and meth (<= (length split) 2))
- (cadr split))))
-
-(cl-defun helm-file-human-size (size &optional (kbsize helm-default-kbsize))
- "Return a string showing SIZE of a file in human readable form.
-SIZE can be an integer or a float depending it's value.
-`file-attributes' will take care of that to avoid overflow error.
-KBSIZE if a floating point number, defaulting to `helm-default-kbsize'."
- (let ((M (cons "M" (/ size (expt kbsize 2))))
- (G (cons "G" (/ size (expt kbsize 3))))
- (K (cons "K" (/ size kbsize)))
- (B (cons "B" size)))
- (cl-loop with result = B
- for (a . b) in
- (cl-loop for (x . y) in (list M G K B)
- unless (< y 1) collect (cons x y))
- when (< b (cdr result)) do (setq result (cons a b))
- finally return (if (string= (car result) "B")
- (format "%s" size)
- (format "%.1f%s" (cdr result) (car result))))))
-
-(cl-defun helm-file-attributes
- (file &key type links uid gid access-time modif-time
- status size mode gid-change inode device-num dired human-size
- mode-type mode-owner mode-group mode-other (string t))
- "Return `file-attributes' elements of FILE separately according to key value.
-Availables keys are:
-- TYPE: Same as nth 0 `files-attributes' if STRING is nil
- otherwise return either symlink, directory or file (default).
-- LINKS: See nth 1 `files-attributes'.
-- UID: See nth 2 `files-attributes'.
-- GID: See nth 3 `files-attributes'.
-- ACCESS-TIME: See nth 4 `files-attributes', however format time
- when STRING is non--nil (the default).
-- MODIF-TIME: See nth 5 `files-attributes', same as above.
-- STATUS: See nth 6 `files-attributes', same as above.
-- SIZE: See nth 7 `files-attributes'.
-- MODE: See nth 8 `files-attributes'.
-- GID-CHANGE: See nth 9 `files-attributes'.
-- INODE: See nth 10 `files-attributes'.
-- DEVICE-NUM: See nth 11 `files-attributes'.
-- DIRED: A line similar to what 'ls -l' return.
-- HUMAN-SIZE: The size in human form, see `helm-file-human-size'.
-- MODE-TYPE, mode-owner,mode-group, mode-other: Split what
- nth 7 `files-attributes' return in four categories.
-- STRING: When non--nil (default) `helm-file-attributes' return
- more friendly values.
-If you want the same behavior as `files-attributes' ,
-\(but with return values in proplist\) use a nil value for STRING.
-However when STRING is non--nil, time and type value are different from what
-you have in `file-attributes'."
- (let* ((all (cl-destructuring-bind
- (type links uid gid access-time modif-time
- status size mode gid-change inode device-num)
- (file-attributes file string)
- (list :type (if string
- (cond ((stringp type) "symlink") ; fname
- (type "directory") ; t
- (t "file")) ; nil
- type)
- :links links
- :uid uid
- :gid gid
- :access-time (if string
- (format-time-string
- "%Y-%m-%d %R" access-time)
- access-time)
- :modif-time (if string
- (format-time-string
- "%Y-%m-%d %R" modif-time)
- modif-time)
- :status (if string
- (format-time-string
- "%Y-%m-%d %R" status)
- status)
- :size size
- :mode mode
- :gid-change gid-change
- :inode inode
- :device-num device-num)))
- (modes (helm-split-mode-file-attributes (cl-getf all :mode))))
- (cond (type (cl-getf all :type))
- (links (cl-getf all :links))
- (uid (cl-getf all :uid))
- (gid (cl-getf all :gid))
- (access-time (cl-getf all :access-time))
- (modif-time (cl-getf all :modif-time))
- (status (cl-getf all :status))
- (size (cl-getf all :size))
- (mode (cl-getf all :mode))
- (gid-change (cl-getf all :gid-change))
- (inode (cl-getf all :inode))
- (device-num (cl-getf all :device-num))
- (dired
- (concat
- (helm-split-mode-file-attributes (cl-getf all :mode) t) " "
- (number-to-string (cl-getf all :links)) " "
- (cl-getf all :uid) ":"
- (cl-getf all :gid) " "
- (if human-size
- (helm-file-human-size (cl-getf all :size))
- (int-to-string (cl-getf all :size))) " "
- (cl-getf all :modif-time)))
- (human-size (helm-file-human-size (cl-getf all :size)))
- (mode-type (cl-getf modes :mode-type))
- (mode-owner (cl-getf modes :user))
- (mode-group (cl-getf modes :group))
- (mode-other (cl-getf modes :other))
- (t (append all modes)))))
-
-(defun helm-split-mode-file-attributes (str &optional string)
- "Split mode file attributes STR into a proplist.
-If STRING is non--nil return instead a space separated string."
- (cl-loop with type = (substring str 0 1)
- with cdr = (substring str 1)
- for i across cdr
- for count from 1
- if (<= count 3)
- concat (string i) into user
- if (and (> count 3) (<= count 6))
- concat (string i) into group
- if (and (> count 6) (<= count 9))
- concat (string i) into other
- finally return
- (if string
- (mapconcat 'identity (list type user group other) " ")
- (list :mode-type type :user user :group group :other other))))
-
-(defmacro with-helm-display-marked-candidates (buffer-or-name candidates &rest body)
- (declare (indent 0) (debug t))
- (helm-with-gensyms (buffer window)
- `(let* ((,buffer (temp-buffer-window-setup ,buffer-or-name))
- ,window)
- (unwind-protect
- (with-current-buffer ,buffer
- (dired-format-columns-of-files ,candidates)
- (select-window
- (setq ,window (temp-buffer-window-show
- ,buffer
- '(display-buffer-below-selected
- (window-height . fit-window-to-buffer)))))
- (progn ,@body))
- (quit-window 'kill ,window)))))
-
-;;; Persistent Action Helpers
-;;
-;;
-;; Internal
-(defvar helm-match-line-overlay nil)
-(defvar helm--match-item-overlays nil)
-
-(defun helm-highlight-current-line (&optional start end buf face pulse)
- "Highlight and underline current position"
- (let* ((start (or start (line-beginning-position)))
- (end (or end (1+ (line-end-position))))
- (start-match (if (or (null helm-highlight-number-lines-around-point)
- (zerop helm-highlight-number-lines-around-point))
- start
- (save-excursion
- (forward-line
- (- helm-highlight-number-lines-around-point))
- (point-at-bol))))
- (end-match (if (or (null helm-highlight-number-lines-around-point)
- (zerop helm-highlight-number-lines-around-point))
- end
- (save-excursion
- (forward-line
- helm-highlight-number-lines-around-point)
- (point-at-eol))))
- (args (list start end buf)))
- (if (not helm-match-line-overlay)
- (setq helm-match-line-overlay (apply 'make-overlay args))
- (apply 'move-overlay helm-match-line-overlay args))
- (overlay-put helm-match-line-overlay
- 'face (or face 'helm-selection-line))
- (catch 'empty-line
- (cl-loop with ov
- for r in (helm-remove-if-match
- "\\`!" (split-string helm-input))
- do (save-excursion
- (goto-char start-match)
- (while (condition-case _err
- (if helm-migemo-mode
- (helm-mm-migemo-forward r end-match t)
- (re-search-forward r end-match t))
- (invalid-regexp nil))
- (let ((s (match-beginning 0))
- (e (match-end 0)))
- (if (= s e)
- (throw 'empty-line nil)
- (push (setq ov (make-overlay s e))
- helm--match-item-overlays)
- (overlay-put ov 'face 'helm-match-item)
- (overlay-put ov 'priority 1)))))))
- (recenter)
- (when pulse
- (sit-for 0.3)
- (helm-match-line-cleanup))))
-
-(defun helm-match-line-cleanup ()
- (when helm-match-line-overlay
- (delete-overlay helm-match-line-overlay)
- (setq helm-match-line-overlay nil))
- (when helm--match-item-overlays
- (mapc 'delete-overlay helm--match-item-overlays)))
-
-(defun helm-match-line-update ()
- (when helm-match-line-overlay
- (delete-overlay helm-match-line-overlay)
- (helm-highlight-current-line)))
-
-(defun helm-persistent-autoresize-hook ()
- (when (and helm-buffers-to-resize-on-pa
- (member helm-buffer helm-buffers-to-resize-on-pa)
- (eq helm-split-window-state 'vertical))
- (set-window-text-height (helm-window) helm-resize-on-pa-text-height)))
-
-(add-hook 'helm-after-persistent-action-hook 'helm-persistent-autoresize-hook)
-(add-hook 'helm-cleanup-hook 'helm-match-line-cleanup)
-(add-hook 'helm-after-persistent-action-hook 'helm-match-line-update)
-
-(defun helm-open-file-with-default-tool (file)
- "Open FILE with the default tool on this platform."
- (let (process-connection-type)
- (if (eq system-type 'windows-nt)
- (helm-w32-shell-execute-open-file file)
- (start-process "helm-open-file-with-default-tool"
- nil
- (cond ((eq system-type 'gnu/linux)
- "xdg-open")
- ((or (eq system-type 'darwin) ;; Mac OS X
- (eq system-type 'macos)) ;; Mac OS 9
- "open"))
- file))))
-
-(defun helm-open-dired (file)
- "Opens a dired buffer in FILE's directory. If FILE is a
-directory, open this directory."
- (if (file-directory-p file)
- (dired file)
- (dired (file-name-directory file))
- (dired-goto-file file)))
-
-(defun helm-require-or-error (feature function)
- (or (require feature nil t)
- (error "Need %s to use `%s'." feature function)))
-
-(defun helm-find-file-as-root (candidate)
- (let* ((buf (helm-basename candidate))
- (host (file-remote-p candidate 'host))
- (remote-path (format "/%s:%s:%s"
- helm-su-or-sudo
- (or host "")
- (expand-file-name
- (if host
- (file-remote-p candidate 'localname)
- candidate))))
- non-essential)
- (if (buffer-live-p (get-buffer buf))
- (progn
- (set-buffer buf)
- (find-alternate-file remote-path))
- (find-file remote-path))))
-
-(defun helm-find-many-files (_ignore)
- (let ((helm--reading-passwd-or-string t))
- (mapc 'find-file (helm-marked-candidates))))
-
-(defun helm-read-repeat-string (prompt &optional count)
- "Prompt as many time PROMPT is not empty.
-If COUNT is non--nil add a number after each prompt."
- (cl-loop with elm
- while (not (string= elm ""))
- for n from 1
- do (when count
- (setq prompt (concat prompt (int-to-string n) ": ")))
- collect (setq elm (helm-read-string prompt)) into lis
- finally return (remove "" lis)))
-
-(defun helm-html-bookmarks-to-alist (file url-regexp bmk-regexp)
- "Parse html bookmark FILE and return an alist with (title . url) as elements."
- (let (bookmarks-alist url title)
- (with-temp-buffer
- (insert-file-contents file)
- (goto-char (point-min))
- (while (re-search-forward "href=\\|^ *<DT><A HREF=" nil t)
- (forward-line 0)
- (when (re-search-forward url-regexp nil t)
- (setq url (match-string 0)))
- (when (re-search-forward bmk-regexp nil t)
- (setq title (match-string 1)))
- (push (cons title url) bookmarks-alist)
- (forward-line)))
- (nreverse bookmarks-alist)))
-
-
-(provide 'helm-utils)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-utils.el ends here
+++ /dev/null
-#!/usr/bin/env bash
-
-
-## Copyright (C) 2012 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-## 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/>.
-
-## Commentary:
-
-# Preconfigured Emacs with a basic helm configuration.
-# Useful to start quickly an emacs -Q with helm.
-# Run it from this directory or symlink it somewhere in your PATH.
-
-# If TEMP env var exists use it otherwise declare it.
-[ -z $TEMP ] && declare TEMP="/tmp"
-
-CONF_FILE="$TEMP/helm-cfg.el"
-EMACS=emacs
-
-case $1 in
- -P)
- shift 1
- declare EMACS=$1
- shift 1
- ;;
- -h)
- echo "Usage: ${0##*/} [-P} Emacs path [-h} help [--] EMACS ARGS"
- exit 2
- ;;
-esac
-
-cd $(dirname "$0")
-
-# Check if autoload file exists.
-# It is maybe in a different directory if
-# emacs-helm.sh is a symlink.
-LS=$(ls -l $0 | awk '{print $11}')
-if [ ! -z $LS ]; then
- AUTO_FILE="$(dirname $LS)/helm-autoloads.el"
-else
- AUTO_FILE="helm-autoloads.el"
-fi
-if [ ! -e "$AUTO_FILE" ]; then
- echo No autoloads found, please run make first to generate autoload file
- exit 2
-fi
-
-
-cat > $CONF_FILE <<EOF
-(setq initial-scratch-message (concat initial-scratch-message
-";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\
-;; This Emacs is Powered by \`HELM' using\n\
-;; emacs program \"$EMACS\".\n\
-;; This is a minimal \`helm' configuration to discover \`helm' or debug it.\n\
-;; You can retrieve this minimal configuration in \"$CONF_FILE\" \n\
-;; Some originals emacs commands have been replaced by own \`helm' commands:\n\n\
-;; - \`find-file'(C-x C-f) =>\`helm-find-files'\n\
-;; - \`occur'(M-s o) =>\`helm-occur'\n\
-;; - \`list-buffers'(C-x C-b) =>\`helm-buffers-list'\n\
-;; - \`completion-at-point'(M-tab) =>\`helm-lisp-completion-at-point'[1]\n\
-;; - \`dabbrev-expand'(M-/) =>\`helm-dabbrev'\n\n\
-;; - \`execute-extended-command'(M-x) =>\`helm-M-x'\n\n
-;; Some others native emacs commands are \"helmized\" by \`helm-mode'.\n\
-;; [1] Coming with emacs-24.4 \`completion-at-point' is \"helmized\" by \`helm-mode'\n\
-;; which provide helm completion in many other places like \`shell-mode'.\n\
-;; You will find embeded help for most helm commands with \`C-h m'.\n\
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n"))
-
-(setq package-user-dir (directory-file-name
- (file-name-directory
- (directory-file-name default-directory))))
-(unless (member "helm.el" (directory-files default-directory))
- (setq package-load-list '((helm-core t) (helm t) (async t) (popup t)))
- (package-initialize))
-(add-to-list 'load-path (file-name-directory (file-truename "$0")))
-(setq default-frame-alist '((vertical-scroll-bars . nil)
- (tool-bar-lines . 0)
- (menu-bar-lines . 0)
- (fullscreen . nil)))
-(blink-cursor-mode -1)
-(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)
-(global-set-key (kbd "M-x") 'helm-M-x)
-(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))
-(add-hook 'kill-emacs-hook #'(lambda () (and (file-exists-p "$CONF_FILE") (delete-file "$CONF_FILE"))))
-EOF
-
-$EMACS -Q -l $CONF_FILE $@
-
+++ /dev/null
-;;; helm-adaptive.el --- Adaptive Sorting of Candidates. -*- lexical-binding: t -*-
-
-;; Original Author: Tamas Patrovics
-
-;; Copyright (C) 2007 Tamas Patrovics
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-
-\f
-(defgroup helm-adapt nil
- "Adaptative sorting of candidates for Helm."
- :group 'helm)
-
-(defcustom helm-adaptive-history-file
- "~/.emacs.d/helm-adaptive-history"
- "Path of file where history information is stored."
- :type 'string
- :group 'helm-adapt)
-
-(defcustom helm-adaptive-history-length 50
- "Maximum number of candidates stored for a source."
- :type 'number
- :group 'helm-adapt)
-
-\f
-;; Internal
-(defvar helm-adaptive-done nil
- "nil if history information is not yet stored for the current
-selection.")
-
-(defvar helm-adaptive-history nil
- "Contains the stored history information.
-Format: ((SOURCE-NAME (SELECTED-CANDIDATE (PATTERN . NUMBER-OF-USE) ...) ...) ...)")
-
-(defun helm-adaptive-done-reset ()
- (setq helm-adaptive-done nil))
-
-;;;###autoload
-(define-minor-mode helm-adaptive-mode
- "Toggle adaptive sorting in all sources."
- :group 'helm-adapt
- :require 'helm-adaptive
- :global t
- (if helm-adaptive-mode
- (progn
- (unless helm-adaptive-history
- (helm-adaptive-maybe-load-history))
- (add-hook 'kill-emacs-hook 'helm-adaptive-save-history)
- ;; Should run at beginning of `helm-initial-setup'.
- (add-hook 'helm-before-initialize-hook 'helm-adaptive-done-reset)
- ;; Should run at beginning of `helm-exit-minibuffer'.
- (add-hook 'helm-before-action-hook 'helm-adaptive-store-selection)
- ;; Should run at beginning of `helm-select-action'.
- (add-hook 'helm-select-action-hook 'helm-adaptive-store-selection))
- (helm-adaptive-save-history)
- (setq helm-adaptive-history nil)
- (remove-hook 'kill-emacs-hook 'helm-adaptive-save-history)
- (remove-hook 'helm-before-initialize-hook 'helm-adaptive-done-reset)
- (remove-hook 'helm-before-action-hook 'helm-adaptive-store-selection)
- (remove-hook 'helm-select-action-hook 'helm-adaptive-store-selection)))
-
-(defun helm-adapt-use-adaptive-p (&optional source-name)
- "Return current source only if it use adaptive history, nil otherwise."
- (when helm-adaptive-mode
- (let* ((source (or source-name (helm-get-current-source)))
- (adapt-source (or (assoc-default 'filtered-candidate-transformer
- (assoc (assoc-default 'type source)
- helm-type-attributes))
- (assoc-default 'candidate-transformer
- (assoc (assoc-default 'type source)
- helm-type-attributes))
- (assoc-default 'filtered-candidate-transformer source)
- (assoc-default 'candidate-transformer source))))
- (if (listp adapt-source)
- (and (member 'helm-adaptive-sort adapt-source) source)
- (and (eq adapt-source 'helm-adaptive-sort) source)))))
-
-(defun helm-adaptive-store-selection ()
- "Store history information for the selected candidate."
- (unless helm-adaptive-done
- (setq helm-adaptive-done t)
- (let ((source (helm-adapt-use-adaptive-p)))
- (when source
- (let* ((source-name (or (assoc-default 'type source)
- (assoc-default 'name source)))
- (source-info (or (assoc source-name helm-adaptive-history)
- (progn
- (push (list source-name) helm-adaptive-history)
- (car helm-adaptive-history))))
- (selection (helm-get-selection))
- (selection-info (progn
- (setcdr source-info
- (cons
- (let ((found (assoc selection (cdr source-info))))
- (if (not found)
- ;; new entry
- (list selection)
- ;; move entry to the beginning of the
- ;; list, so that it doesn't get
- ;; trimmed when the history is
- ;; truncated
- (setcdr source-info
- (delete found (cdr source-info)))
- found))
- (cdr source-info)))
- (cadr source-info)))
- (pattern-info (progn
- (setcdr selection-info
- (cons
- (let ((found (assoc helm-pattern (cdr selection-info))))
- (if (not found)
- ;; new entry
- (cons helm-pattern 0)
-
- ;; move entry to the beginning of the
- ;; list, so if two patterns used the
- ;; same number of times then the one
- ;; used last appears first in the list
- (setcdr selection-info
- (delete found (cdr selection-info)))
- found))
- (cdr selection-info)))
- (cadr selection-info))))
-
- ;; increase usage count
- (setcdr pattern-info (1+ (cdr pattern-info)))
-
- ;; truncate history if needed
- (if (> (length (cdr selection-info)) helm-adaptive-history-length)
- (setcdr selection-info
- (cl-subseq (cdr selection-info) 0 helm-adaptive-history-length))))))))
-
-(defun helm-adaptive-maybe-load-history ()
- "Load `helm-adaptive-history-file' which contain `helm-adaptive-history'.
-Returns nil if `helm-adaptive-history-file' doesn't exist."
- (when (file-readable-p helm-adaptive-history-file)
- (load-file helm-adaptive-history-file)))
-
-(defun helm-adaptive-save-history (&optional arg)
- "Save history information to file given by `helm-adaptive-history-file'."
- (interactive "p")
- (with-temp-buffer
- (insert
- ";; -*- mode: emacs-lisp -*-\n"
- ";; History entries used for helm adaptive display.\n")
- (prin1 `(setq helm-adaptive-history ',helm-adaptive-history)
- (current-buffer))
- (insert ?\n)
- (write-region (point-min) (point-max) helm-adaptive-history-file nil
- (unless arg 'quiet))))
-
-(defun helm-adaptive-sort (candidates source)
- "Sort the CANDIDATES for SOURCE by usage frequency.
-This is a filtered candidate transformer you can use with the
-`filtered-candidate-transformer' attribute."
- (let* ((source-name (or (assoc-default 'type source)
- (assoc-default 'name source)))
- (source-info (assoc source-name helm-adaptive-history)))
- (if source-info
- (let ((usage
- ;; ... assemble a list containing the (CANIDATE . USAGE-COUNT)
- ;; pairs
- (mapcar (lambda (candidate-info)
- (let ((count 0))
- (cl-dolist (pattern-info (cdr candidate-info))
- (if (not (equal (car pattern-info)
- helm-pattern))
- (cl-incf count (cdr pattern-info))
-
- ;; if current pattern is equal to the previously
- ;; used one then this candidate has priority
- ;; (that's why its count is boosted by 10000) and
- ;; it only has to compete with other candidates
- ;; which were also selected with the same pattern
- (setq count (+ 10000 (cdr pattern-info)))
- (cl-return)))
- (cons (car candidate-info) count)))
- (cdr source-info))))
- (if (and usage (consp usage))
- ;; sort the list in descending order, so candidates with highest
- ;; priorty come first
- (progn
- (setq usage (sort usage (lambda (first second)
- (> (cdr first) (cdr second)))))
-
- ;; put those candidates first which have the highest usage count
- (cl-loop for (info . _freq) in usage
- for member = (cl-member info candidates
- :test 'helm-adaptive-compare)
- when member collect (car member) into sorted
- and do
- (setq candidates (cl-remove info candidates
- :test 'helm-adaptive-compare))
- finally return (append sorted candidates)))
- (message "Your `%s' is maybe corrupted or too old, \
-you should reinitialize it with `helm-reset-adaptive-history'"
- helm-adaptive-history-file)
- (sit-for 1)
- candidates))
- ;; if there is no information stored for this source then do nothing
- candidates)))
-
-;;;###autoload
-(defun helm-reset-adaptive-history ()
- "Delete all `helm-adaptive-history' and his file.
-Useful when you have a old or corrupted `helm-adaptive-history-file'."
- (interactive)
- (when (y-or-n-p "Really delete all your `helm-adaptive-history'? ")
- (setq helm-adaptive-history nil)
- (delete-file helm-adaptive-history-file)))
-
-(defun helm-adaptive-compare (x y)
- "Compare candidates X and Y taking into account that the
-candidate can be in (DISPLAY . REAL) format."
- (equal (if (listp x) (cdr x) x)
- (if (listp y) (cdr y) y)))
-
-
-(provide 'helm-adaptive)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-adaptive.el ends here
+++ /dev/null
-;;; helm-apt.el --- Helm interface for Debian/Ubuntu packages (apt-*) -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-utils)
-(require 'helm-external)
-(require 'helm-help)
-
-(declare-function term-line-mode "term")
-(declare-function term-char-mode "term")
-(declare-function term-send-input "term")
-(declare-function term-send-eof "term")
-
-\f
-(defgroup helm-apt nil
- "Apt related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-apt-cache-show-function 'helm-apt-cache-show-1
- "Function of one argument used to show apt package.
-Default is `helm-apt-cache-show-1' but you can use `apt-utils-show-package-1'
-from `apt-utils.el' to have something more enhanced.
-If nil default `helm-apt-cache-show-1' will be used."
- :type 'function
- :group 'helm-apt)
-
-(defcustom helm-apt-actions
- '(("Show package description" . helm-apt-cache-show)
- ("Install package(s)" . helm-apt-install)
- ("Reinstall package(s)" . helm-apt-reinstall)
- ("Remove package(s)" . helm-apt-uninstall)
- ("Purge package(s)" . helm-apt-purge))
- "Actions for helm apt."
- :group 'helm-apt
- :type '(alist :key-type string :value-type function))
-
-(defface helm-apt-installed
- '((t (:foreground "green")))
- "Face used for apt installed candidates."
- :group 'helm-apt)
-
-(defface helm-apt-deinstalled
- '((t (:foreground "DimGray")))
- "Face used for apt deinstalled candidates."
- :group 'helm-apt)
-
-\f
-(defvar helm-apt-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-I") 'helm-apt-show-only-installed)
- (define-key map (kbd "M-U") 'helm-apt-show-only-not-installed)
- (define-key map (kbd "M-D") 'helm-apt-show-only-deinstalled)
- (define-key map (kbd "M-A") 'helm-apt-show-all)
- map))
-
-\f
-(defvar helm-source-apt
- (helm-build-in-buffer-source "APT"
- :init #'helm-apt-init
- :candidate-transformer #'helm-apt-candidate-transformer
- :display-to-real #'helm-apt-display-to-real
- :update #'helm-apt-refresh
- :keymap helm-apt-map
- :help-message 'helm-apt-help-message
- :action 'helm-apt-actions
- :persistent-action #'helm-apt-persistent-action
- :persistent-help "Show package description"))
-
-;;; Internals vars
-(defvar helm-apt-search-command "apt-cache search '%s'")
-(defvar helm-apt-show-command "apt-cache show '%s'")
-(defvar helm-apt-installed-packages nil)
-(defvar helm-apt-all-packages nil)
-(defvar helm-apt-input-history nil)
-(defvar helm-apt-show-only 'all)
-(defvar helm-apt-term-buffer nil)
-(defvar helm-apt-default-archs nil)
-
-(defun helm-apt-refresh ()
- "Refresh installed candidates list."
- (setq helm-apt-installed-packages nil)
- (setq helm-apt-all-packages nil))
-
-(defun helm-apt-persistent-action (candidate)
- "Persistent action for APT source."
- (helm-apt-cache-show candidate))
-
-(defun helm-apt--installed-package-name (name)
- (cl-loop for arch in helm-apt-default-archs
- thereis (or (assoc-default
- name helm-apt-installed-packages)
- (assoc-default
- (format "%s:%s" name arch)
- helm-apt-installed-packages))))
-
-(defun helm-apt-candidate-transformer (candidates)
- "Show installed CANDIDATES and the ones to deinstall in a different color."
- (cl-loop for cand in candidates
- for name = (helm-apt-display-to-real cand)
- for deinstall = (string=
- (helm-apt--installed-package-name name)
- "deinstall")
- for install = (string=
- (helm-apt--installed-package-name name)
- "install")
- for show = (cond ((and deinstall
- (memq helm-apt-show-only '(all deinstalled)))
- (propertize cand 'face 'helm-apt-deinstalled))
- ((and install
- (memq helm-apt-show-only '(all installed)))
- (propertize cand 'face 'helm-apt-installed))
- ((and (eq helm-apt-show-only 'noinstalled)
- (not install)) cand)
- ((eq helm-apt-show-only 'all) cand))
- when show collect show))
-
-(defun helm-apt-show-only-installed ()
- (interactive)
- (with-helm-alive-p
- (setq helm-apt-show-only 'installed)
- (helm-update)))
-(put 'helm-apt-show-only-installed 'helm-only t)
-
-(defun helm-apt-show-only-not-installed ()
- (interactive)
- (with-helm-alive-p
- (setq helm-apt-show-only 'noinstalled)
- (helm-update)))
-(put 'helm-apt-show-only-not-installed 'helm-only t)
-
-(defun helm-apt-show-only-deinstalled ()
- (interactive)
- (with-helm-alive-p
- (setq helm-apt-show-only 'deinstalled)
- (helm-update)))
-(put 'helm-apt-show-only-deinstalled 'helm-only t)
-
-(defun helm-apt-show-all ()
- (interactive)
- (with-helm-alive-p
- (setq helm-apt-show-only 'all)
- (helm-update)))
-(put 'helm-apt-show-all 'helm-only t)
-
-(defun helm-apt-init ()
- "Initialize list of debian packages."
- (let ((query ""))
- (unless (and helm-apt-installed-packages
- helm-apt-all-packages)
- (message "Loading package list...")
- (setq helm-apt-installed-packages
- (with-temp-buffer
- (call-process-shell-command "dpkg --get-selections"
- nil (current-buffer))
- (cl-loop for i in (split-string (buffer-string) "\n" t)
- for p = (split-string i)
- collect (cons (car p) (cadr p)))))
- (helm-init-candidates-in-buffer
- 'global
- (setq helm-apt-all-packages
- (with-temp-buffer
- (call-process-shell-command
- (format helm-apt-search-command query)
- nil (current-buffer))
- (buffer-string))))
- (message "Loading package list done")
- (sit-for 0.5))))
-
-(defun helm-apt-display-to-real (line)
- "Return only name of a debian package.
-LINE is displayed like:
-package name - description."
- (car (split-string line " - ")))
-
-(defvar helm-apt-show-current-package nil)
-(define-derived-mode helm-apt-show-mode
- special-mode "helm-apt-show"
- "Mode to display infos on apt packages.")
-
-(defun helm-apt-cache-show (package)
- "Show information on apt package PACKAGE."
- (if (and (functionp helm-apt-cache-show-function)
- (not (eq helm-apt-cache-show-function
- 'helm-apt-cache-show)))
- ;; A function, call it.
- (funcall helm-apt-cache-show-function package)
- ;; nil or whatever use default.
- (helm-apt-cache-show-1 package)))
-
-(defun helm-apt-cache-show-1 (package)
- (let* ((command (format helm-apt-show-command package))
- (buf (get-buffer-create "*helm apt show*")))
- (switch-to-buffer buf)
- (unless (string= package helm-apt-show-current-package)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (save-excursion
- (call-process-shell-command
- command nil (current-buffer) t))))
- (helm-apt-show-mode)
- (set (make-local-variable 'helm-apt-show-current-package)
- package)))
-
-(defun helm-apt-install (_package)
- "Run 'apt-get install' shell command on PACKAGE."
- (helm-apt-generic-action :action 'install))
-
-(defun helm-apt-reinstall (_package)
- "Run 'apt-get install --reinstall' shell command on PACKAGE."
- (helm-apt-generic-action :action 'reinstall))
-
-(defun helm-apt-uninstall (_package)
- "Run 'apt-get remove' shell command on PACKAGE."
- (helm-apt-generic-action :action 'uninstall))
-
-(defun helm-apt-purge (_package)
- "Run 'apt-get purge' shell command on PACKAGE."
- (helm-apt-generic-action :action 'purge))
-
-(cl-defun helm-apt-generic-action (&key action)
- "Run 'apt-get ACTION'.
-Support install, remove and purge actions."
- (if (and helm-apt-term-buffer
- (buffer-live-p (get-buffer helm-apt-term-buffer)))
- (switch-to-buffer helm-apt-term-buffer)
- (ansi-term (getenv "SHELL") "term apt")
- (setq helm-apt-term-buffer (buffer-name)))
- (term-line-mode)
- (let ((command (cl-case action
- (install "sudo apt-get install ")
- (reinstall "sudo apt-get install --reinstall ")
- (uninstall "sudo apt-get remove ")
- (purge "sudo apt-get purge ")
- (t (error "Unknown action"))))
- (beg (point))
- end
- (cand-list (mapconcat (lambda (x) (format "'%s'" x))
- (helm-marked-candidates) " ")))
- (goto-char (point-max))
- (insert (concat command cand-list))
- (setq end (point))
- (if (y-or-n-p (format "%s package(s)" (symbol-name action)))
- (progn
- (setq helm-external-commands-list nil)
- (setq helm-apt-installed-packages nil)
- (term-char-mode) (term-send-input))
- (delete-region beg end))))
-
-;;;###autoload
-(defun helm-apt (arg)
- "Preconfigured `helm' : frontend of APT package manager.
-With a prefix arg reload cache."
- (interactive "P")
- (setq helm-apt-show-only 'all)
- (unless helm-apt-default-archs
- (setq helm-apt-default-archs
- (append (split-string
- (shell-command-to-string
- "dpkg --print-architecture")
- "\n" t)
- (split-string
- (shell-command-to-string
- "dpkg --print-foreign-architectures")
- "\n" t))))
- (let ((query (read-string "Search Package: " nil 'helm-apt-input-history)))
- (when arg (helm-apt-refresh))
- (helm :sources 'helm-source-apt
- :prompt "Search Package: "
- :input query
- :buffer "*helm apt*"
- :history 'helm-apt-input-history)))
-
-
-(provide 'helm-apt)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-apt.el ends here
+++ /dev/null
-;;; helm-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-(add-to-list 'load-path (or (file-name-directory #$) (car load-path)))
-\f
-;;;### (autoloads nil "helm-adaptive" "helm-adaptive.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-adaptive.el
-
-(defvar helm-adaptive-mode nil "\
-Non-nil if Helm-Adaptive mode is enabled.
-See the command `helm-adaptive-mode' for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `helm-adaptive-mode'.")
-
-(custom-autoload 'helm-adaptive-mode "helm-adaptive" nil)
-
-(autoload 'helm-adaptive-mode "helm-adaptive" "\
-Toggle adaptive sorting in all sources.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'helm-reset-adaptive-history "helm-adaptive" "\
-Delete all `helm-adaptive-history' and his file.
-Useful when you have a old or corrupted `helm-adaptive-history-file'.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-apt" "helm-apt.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-apt.el
-
-(autoload 'helm-apt "helm-apt" "\
-Preconfigured `helm' : frontend of APT package manager.
-With a prefix arg reload cache.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-bookmark" "helm-bookmark.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-bookmark.el
-
-(autoload 'helm-bookmarks "helm-bookmark" "\
-Preconfigured `helm' for bookmarks.
-
-\(fn)" t nil)
-
-(autoload 'helm-filtered-bookmarks "helm-bookmark" "\
-Preconfigured helm for bookmarks (filtered by category).
-Optional source `helm-source-bookmark-addressbook' is loaded
-only if external library addressbook-bookmark.el is available.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-buffers" "helm-buffers.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-buffers.el
-
-(autoload 'helm-buffers-list "helm-buffers" "\
-Preconfigured `helm' to list buffers.
-
-\(fn)" t nil)
-
-(autoload 'helm-mini "helm-buffers" "\
-Preconfigured `helm' lightweight version (buffer -> recentf).
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-color" "helm-color.el" (22215 7711 0
-;;;;;; 0))
-;;; Generated autoloads from helm-color.el
-
-(autoload 'helm-colors "helm-color" "\
-Preconfigured `helm' for color.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-command" "helm-command.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-command.el
-
-(autoload 'helm-M-x "helm-command" "\
-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, are passed AFTER starting `helm-M-x'.
-
-You can get help on each command by persistent action.
-
-\(fn ARG &optional COMMAND-NAME)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-config" "helm-config.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-config.el
-
-(autoload 'helm-configuration "helm-config" "\
-Customize `helm'.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-dabbrev" "helm-dabbrev.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-dabbrev.el
-
-(autoload 'helm-dabbrev "helm-dabbrev" "\
-Preconfigured helm for dynamic abbreviations.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-elisp" "helm-elisp.el" (22215 7711 0
-;;;;;; 0))
-;;; Generated autoloads from helm-elisp.el
-
-(autoload 'helm-lisp-completion-at-point "helm-elisp" "\
-Preconfigured helm for lisp symbol completion at point.
-
-\(fn)" t nil)
-
-(autoload 'helm-complete-file-name-at-point "helm-elisp" "\
-Preconfigured helm to complete file name at point.
-
-\(fn &optional FORCE)" t nil)
-
-(autoload 'helm-lisp-indent "helm-elisp" "\
-
-
-\(fn)" t nil)
-
-(autoload 'helm-lisp-completion-or-file-name-at-point "helm-elisp" "\
-Preconfigured helm to complete lisp symbol or filename at point.
-Filename completion happen if string start after or between a double quote.
-
-\(fn)" t nil)
-
-(autoload 'helm-apropos "helm-elisp" "\
-Preconfigured helm to describe commands, functions, variables and faces.
-
-\(fn)" t nil)
-
-(autoload 'helm-manage-advice "helm-elisp" "\
-Preconfigured `helm' to disable/enable function advices.
-
-\(fn)" t nil)
-
-(autoload 'helm-locate-library "helm-elisp" "\
-Preconfigured helm to locate elisp libraries.
-
-\(fn)" t nil)
-
-(autoload 'helm-timers "helm-elisp" "\
-Preconfigured `helm' for timers.
-
-\(fn)" t nil)
-
-(autoload 'helm-complex-command-history "helm-elisp" "\
-Preconfigured helm for complex command history.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-elisp-package" "helm-elisp-package.el"
-;;;;;; (22215 7711 0 0))
-;;; Generated autoloads from helm-elisp-package.el
-
-(autoload 'helm-list-elisp-packages "helm-elisp-package" "\
-Preconfigured helm for listing and handling emacs packages.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-list-elisp-packages-no-fetch "helm-elisp-package" "\
-Preconfigured helm for emacs packages.
-Same as `helm-list-elisp-packages' but don't fetch packages on remote.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-elscreen" "helm-elscreen.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-elscreen.el
-
-(autoload 'helm-elscreen "helm-elscreen" "\
-Preconfigured helm to list elscreen.
-
-\(fn)" t nil)
-
-(autoload 'helm-elscreen-history "helm-elscreen" "\
-Preconfigured helm to list elscreen in history order.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-eshell" "helm-eshell.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-eshell.el
-
-(autoload 'helm-esh-pcomplete "helm-eshell" "\
-Preconfigured helm to provide helm completion in eshell.
-
-\(fn)" t nil)
-
-(autoload 'helm-eshell-history "helm-eshell" "\
-Preconfigured helm for eshell history.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-eval" "helm-eval.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-eval.el
-
-(autoload 'helm-eval-expression "helm-eval" "\
-Preconfigured helm for `helm-source-evaluation-result'.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-eval-expression-with-eldoc "helm-eval" "\
-Preconfigured helm for `helm-source-evaluation-result' with `eldoc' support.
-
-\(fn)" t nil)
-
-(autoload 'helm-calcul-expression "helm-eval" "\
-Preconfigured helm for `helm-source-calculation-result'.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-external" "helm-external.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-external.el
-
-(autoload 'helm-run-external-command "helm-external" "\
-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'.
-
-\(fn PROGRAM)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-files" "helm-files.el" (22215 7711 0
-;;;;;; 0))
-;;; Generated autoloads from helm-files.el
-
-(autoload 'helm-browse-project "helm-files" "\
-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>
-and
-<http://melpa.org/#/helm-ls-svn>.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-find "helm-files" "\
-Preconfigured `helm' for the find shell command.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-find-files "helm-files" "\
-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.
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-for-files "helm-files" "\
-Preconfigured `helm' for opening files.
-Run all sources defined in `helm-for-files-preferred-list'.
-
-\(fn)" t nil)
-
-(autoload 'helm-multi-files "helm-files" "\
-Preconfigured helm similar to `helm-for-files' but that don't run locate.
-Allow toggling from locate to others sources.
-This allow seeing first if what you search is in other sources before launching
-locate.
-
-\(fn)" t nil)
-
-(autoload 'helm-recentf "helm-files" "\
-Preconfigured `helm' for `recentf'.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-font" "helm-font.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-font.el
-
-(autoload 'helm-select-xfont "helm-font" "\
-Preconfigured `helm' to select Xfont.
-
-\(fn)" t nil)
-
-(autoload 'helm-ucs "helm-font" "\
-Preconfigured helm for `ucs-names' math symbols.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-grep" "helm-grep.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-grep.el
-
-(autoload 'helm-goto-precedent-file "helm-grep" "\
-Go to precedent file in helm grep/etags buffers.
-
-\(fn)" t nil)
-
-(autoload 'helm-goto-next-file "helm-grep" "\
-Go to precedent file in helm grep/etags buffers.
-
-\(fn)" t nil)
-
-(autoload 'helm-do-grep-ag "helm-grep" "\
-Preconfigured helm for grepping with AG in `default-directory'.
-
-\(fn)" t nil)
-
-(autoload 'helm-grep-do-git-grep "helm-grep" "\
-Preconfigured helm for git-grepping `default-directory'.
-With a prefix arg ARG git-grep the whole repository.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-help" "helm-help.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-help.el
-
-(autoload 'helm-documentation "helm-help" "\
-Preconfigured helm for helm documentation.
-With a prefix arg refresh the documentation.
-
-Find here the documentation of all sources actually documented.
-
-\(fn ARG)" t nil)
-
-(defvar helm-comp-read-mode-line "\\<helm-comp-read-map>C/\\[helm-cr-empty-string]:Empty \\<helm-map>\\[helm-help]:Help \\[helm-select-action]:Act \\[helm-maybe-exit-minibuffer]/f1/f2/f-n:NthAct \\[helm-toggle-suspend-update]:Tog.suspend")
-
-(defvar helm-read-file-name-mode-line-string "\\<helm-read-file-map>\\[helm-help]:Help C/\\[helm-cr-empty-string]:Empty \\<helm-map>\\[helm-select-action]:Act \\[helm-maybe-exit-minibuffer]/f1/f2/f-n:NthAct \\[helm-toggle-suspend-update]:Tog.suspend" "\
-String displayed in mode-line in `helm-source-find-files'.")
-
-(defvar helm-top-mode-line "\\<helm-top-map>\\[helm-help]:Help \\<helm-map>\\[helm-select-action]:Act \\[helm-maybe-exit-minibuffer]/f1/f2/f-n:NthAct \\[helm-toggle-suspend-update]:Tog.suspend")
-
-(autoload 'helm-describe-helm-attribute "helm-help" "\
-Display the full documentation of HELM-ATTRIBUTE.
-HELM-ATTRIBUTE should be a symbol.
-
-\(fn HELM-ATTRIBUTE)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-id-utils" "helm-id-utils.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-id-utils.el
-
-(autoload 'helm-gid "helm-id-utils" "\
-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/>.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-imenu" "helm-imenu.el" (22215 7711 0
-;;;;;; 0))
-;;; Generated autoloads from helm-imenu.el
-
-(autoload 'helm-imenu "helm-imenu" "\
-Preconfigured `helm' for `imenu'.
-
-\(fn)" t nil)
-
-(autoload 'helm-imenu-in-all-buffers "helm-imenu" "\
-Preconfigured helm for fetching imenu entries of all buffers.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-info" "helm-info.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-info.el
-
-(autoload 'helm-info "helm-info" "\
-Preconfigured `helm' for searching Info files' indices.
-
-\(fn)" t nil)
-
-(autoload 'helm-info-at-point "helm-info" "\
-Preconfigured `helm' for searching info at point.
-With a prefix-arg insert symbol at point.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-locate" "helm-locate.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-locate.el
-
-(autoload 'helm-projects-find-files "helm-locate" "\
-Find files with locate in `helm-locate-project-list'.
-With a prefix arg refresh the database in each project.
-
-\(fn UPDATE)" t nil)
-
-(autoload 'helm-locate-read-file-name "helm-locate" "\
-
-
-\(fn PROMPT)" nil nil)
-
-(autoload 'helm-locate "helm-locate" "\
-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'.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-man" "helm-man.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-man.el
-
-(autoload 'helm-man-woman "helm-man" "\
-Preconfigured `helm' for Man and Woman pages.
-With a prefix arg reinitialize the cache.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-misc" "helm-misc.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-misc.el
-
-(autoload 'helm-browse-menubar "helm-misc" "\
-Preconfigured helm to the menubar using lacarte.el.
-
-\(fn)" t nil)
-
-(autoload 'helm-world-time "helm-misc" "\
-Preconfigured `helm' to show world time.
-Default action change TZ environment variable locally to emacs.
-
-\(fn)" t nil)
-
-(autoload 'helm-insert-latex-math "helm-misc" "\
-Preconfigured helm for latex math symbols completion.
-
-\(fn)" t nil)
-
-(autoload 'helm-ratpoison-commands "helm-misc" "\
-Preconfigured `helm' to execute ratpoison commands.
-
-\(fn)" t nil)
-
-(autoload 'helm-stumpwm-commands "helm-misc" "\
-Preconfigured helm for stumpwm commands.
-
-\(fn)" t nil)
-
-(autoload 'helm-minibuffer-history "helm-misc" "\
-Preconfigured `helm' for `minibuffer-history'.
-
-\(fn)" t nil)
-
-(autoload 'helm-comint-input-ring "helm-misc" "\
-Preconfigured `helm' that provide completion of `comint' history.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-mode" "helm-mode.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-mode.el
-
-(autoload 'helm-comp-read "helm-mode" "\
-Read a string in the minibuffer, with helm completion.
-
-It is helm `completing-read' equivalent.
-
-- PROMPT is the prompt name to use.
-
-- COLLECTION can be a list, vector, obarray or hash-table.
- It can be also a function that receives three arguments:
- the values string, predicate and t. See `all-completions' for more details.
-
-Keys description:
-
-- TEST: A predicate called with one arg i.e candidate.
-
-- INITIAL-INPUT: Same as input arg in `helm'.
-
-- PRESELECT: See preselect arg of `helm'.
-
-- DEFAULT: This option is used only for compatibility with regular
- Emacs `completing-read' (Same as DEFAULT arg of `completing-read').
-
-- BUFFER: Name of helm-buffer.
-
-- MUST-MATCH: Candidate selected must be one of COLLECTION.
-
-- FUZZY: Enable fuzzy matching.
-
-- REVERSE-HISTORY: When non--nil display history source after current
- source completion.
-
-- REQUIRES-PATTERN: Same as helm attribute, default is 0.
-
-- HISTORY: A list containing specific history, default is nil.
- When it is non--nil, all elements of HISTORY are displayed in
- a special source before COLLECTION.
-
-- INPUT-HISTORY: A symbol. the minibuffer input history will be
- stored there, if nil or not provided, `minibuffer-history'
- will be used instead.
-
-- CASE-FOLD: Same as `helm-case-fold-search'.
-
-- DEL-INPUT: Boolean, when non--nil (default) remove the partial
- minibuffer input from HISTORY is present.
-
-- PERSISTENT-ACTION: A function called with one arg i.e candidate.
-
-- PERSISTENT-HELP: A string to document PERSISTENT-ACTION.
-
-- MODE-LINE: A string or list to display in mode line.
- Default is `helm-comp-read-mode-line'.
-
-- KEYMAP: A keymap to use in this `helm-comp-read'.
- (the keymap will be shared with history source)
-
-- NAME: The name related to this local source.
-
-- EXEC-WHEN-ONLY-ONE: Bound `helm-execute-action-at-once-if-one'
- to non--nil. (possibles values are t or nil).
-
-- VOLATILE: Use volatile attribute.
-
-- SORT: A predicate to give to `sort' e.g `string-lessp'
- Use this only on small data as it is ineficient.
- If you want to sort faster add a sort function to
- FC-TRANSFORMER.
- Note that FUZZY when enabled is already providing a sort function.
-
-- FC-TRANSFORMER: A `filtered-candidate-transformer' function
- or a list of functions.
-
-- HIST-FC-TRANSFORMER: A `filtered-candidate-transformer'
- function for the history source.
-
-- MARKED-CANDIDATES: If non--nil return candidate or marked candidates as a list.
-
-- NOMARK: When non--nil don't allow marking candidates.
-
-- ALISTP: (default is non--nil) 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.
- Argument VOLATILE have no effect when CANDIDATES-IN-BUFFER is non--nil.
-
-Any prefix args passed during `helm-comp-read' invocation will be recorded
-in `helm-current-prefix-arg', otherwise if prefix args were given before
-`helm-comp-read' invocation, the value of `current-prefix-arg' will be used.
-That's mean you can pass prefix args before or after calling a command
-that use `helm-comp-read' See `helm-M-x' for example.
-
-\(fn PROMPT COLLECTION &key TEST INITIAL-INPUT DEFAULT PRESELECT (buffer \"*Helm Completions*\") MUST-MATCH FUZZY REVERSE-HISTORY (requires-pattern 0) HISTORY INPUT-HISTORY (case-fold helm-comp-read-case-fold-search) (del-input t) (persistent-action nil) (persistent-help \"DoNothing\") (mode-line helm-comp-read-mode-line) HELP-MESSAGE (keymap helm-comp-read-map) (name \"Helm Completions\") CANDIDATES-IN-BUFFER EXEC-WHEN-ONLY-ONE QUIT-WHEN-NO-CAND VOLATILE SORT (fc-transformer (quote helm-cr-default-transformer)) HIST-FC-TRANSFORMER MARKED-CANDIDATES NOMARK (alistp t) (candidate-number-limit helm-candidate-number-limit))" nil nil)
-
-(autoload 'helm-read-file-name "helm-mode" "\
-Read a file name with helm completion.
-It is helm `read-file-name' emulation.
-
-Argument PROMPT is the default prompt to use.
-
-Keys description:
-
-- NAME: Source name, default to \"Read File Name\".
-
-- INITIAL-INPUT: Where to start read file name, default to `default-directory'.
-
-- BUFFER: `helm-buffer' name default to \"*Helm Completions*\".
-
-- TEST: A predicate called with one arg 'candidate'.
-
-- CASE-FOLD: Same as `helm-case-fold-search'.
-
-- PRESELECT: helm preselection.
-
-- HISTORY: Display HISTORY in a special source.
-
-- MUST-MATCH: Can be 'confirm, nil, or t.
-
-- MARKED-CANDIDATES: When non--nil return a list of marked candidates.
-
-- NOMARK: When non--nil don't allow marking candidates.
-
-- ALISTP: Don't use `all-completions' in history (take effect only on history).
-
-- PERSISTENT-ACTION: a persistent action function.
-
-- PERSISTENT-HELP: persistent help message.
-
-- MODE-LINE: A mode line message, default is `helm-read-file-name-mode-line-string'.
-
-\(fn PROMPT &key (name \"Read File Name\") (initial-input default-directory) (buffer \"*Helm file completions*\") TEST (case-fold helm-file-name-case-fold-search) PRESELECT HISTORY MUST-MATCH DEFAULT MARKED-CANDIDATES (candidate-number-limit helm-ff-candidate-number-limit) NOMARK (alistp t) (persistent-action (quote helm-find-files-persistent-action)) (persistent-help \"Hit1 Expand Candidate, Hit2 or (C-u) Find file\") (mode-line helm-read-file-name-mode-line-string))" nil nil)
-
-(defvar helm-mode nil "\
-Non-nil if Helm mode is enabled.
-See the command `helm-mode' for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `helm-mode'.")
-
-(custom-autoload 'helm-mode "helm-mode" nil)
-
-(autoload 'helm-mode "helm-mode" "\
-Toggle generic helm completion.
-
-All functions in Emacs that use `completing-read'
-or `read-file-name' 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 turn it on with `helm-mode'.
-
-Some crap emacs functions may not be supported,
-e.g `ffap-alternate-file' and maybe others
-You can add such functions to `helm-completing-read-handlers-alist'
-with a nil value.
-
-Note: This mode is incompatible with Emacs23.
-
-\(fn &optional ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-net" "helm-net.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-net.el
-
-(autoload 'helm-surfraw "helm-net" "\
-Preconfigured `helm' to search PATTERN with search ENGINE.
-
-\(fn PATTERN ENGINE)" t nil)
-
-(autoload 'helm-google-suggest "helm-net" "\
-Preconfigured `helm' for google search with google suggest.
-
-\(fn)" t nil)
-
-(autoload 'helm-wikipedia-suggest "helm-net" "\
-Preconfigured `helm' for Wikipedia lookup with Wikipedia suggest.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-org" "helm-org.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-org.el
-
-(autoload 'helm-org-agenda-files-headings "helm-org" "\
-Preconfigured helm for org files headings.
-
-\(fn)" t nil)
-
-(autoload 'helm-org-in-buffer-headings "helm-org" "\
-Preconfigured helm for org buffer headings.
-
-\(fn)" t nil)
-
-(autoload 'helm-org-parent-headings "helm-org" "\
-Preconfigured helm for org headings that are parents of the
-current heading.
-
-\(fn)" t nil)
-
-(autoload 'helm-org-capture-templates "helm-org" "\
-Preconfigured helm for org templates.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-regexp" "helm-regexp.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-regexp.el
-
-(autoload 'helm-moccur-mode "helm-regexp" "\
-Major mode to provide actions in helm moccur saved buffer.
-
-Special commands:
-\\{helm-moccur-mode-map}
-
-\(fn)" t nil)
-
-(autoload 'helm-regexp "helm-regexp" "\
-Preconfigured helm to build regexps.
-`query-replace-regexp' can be run from there against found regexp.
-
-\(fn)" t nil)
-
-(autoload 'helm-occur "helm-regexp" "\
-Preconfigured helm for Occur.
-
-\(fn)" t nil)
-
-(autoload 'helm-occur-from-isearch "helm-regexp" "\
-Invoke `helm-occur' from isearch.
-
-\(fn)" t nil)
-
-(autoload 'helm-multi-occur-from-isearch "helm-regexp" "\
-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.
-
-\(fn &optional ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-ring" "helm-ring.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-ring.el
-
-(defvar helm-push-mark-mode nil "\
-Non-nil if Helm-Push-Mark mode is enabled.
-See the command `helm-push-mark-mode' for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `helm-push-mark-mode'.")
-
-(custom-autoload 'helm-push-mark-mode "helm-ring" nil)
-
-(autoload 'helm-push-mark-mode "helm-ring" "\
-Provide an improved version of `push-mark'.
-Modify the behavior of `push-mark' to update
-the `global-mark-ring' after each new visit.
-
-\(fn &optional ARG)" t nil)
-
-(autoload 'helm-mark-ring "helm-ring" "\
-Preconfigured `helm' for `helm-source-mark-ring'.
-
-\(fn)" t nil)
-
-(autoload 'helm-global-mark-ring "helm-ring" "\
-Preconfigured `helm' for `helm-source-global-mark-ring'.
-
-\(fn)" t nil)
-
-(autoload 'helm-all-mark-rings "helm-ring" "\
-Preconfigured `helm' for `helm-source-global-mark-ring' and `helm-source-mark-ring'.
-
-\(fn)" t nil)
-
-(autoload 'helm-register "helm-ring" "\
-Preconfigured `helm' for Emacs registers.
-
-\(fn)" t nil)
-
-(autoload 'helm-show-kill-ring "helm-ring" "\
-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.
-
-\(fn)" t nil)
-
-(autoload 'helm-execute-kmacro "helm-ring" "\
-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.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-semantic" "helm-semantic.el" (22215 7711
-;;;;;; 0 0))
-;;; Generated autoloads from helm-semantic.el
-
-(autoload 'helm-semantic "helm-semantic" "\
-Preconfigured `helm' for `semantic'.
-If ARG is supplied, pre-select symbol at point instead of current
-
-\(fn ARG)" t nil)
-
-(autoload 'helm-semantic-or-imenu "helm-semantic" "\
-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.
-
-\(fn ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-sys" "helm-sys.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-sys.el
-
-(autoload 'helm-top "helm-sys" "\
-Preconfigured `helm' for top command.
-
-\(fn)" t nil)
-
-(autoload 'helm-list-emacs-process "helm-sys" "\
-Preconfigured `helm' for emacs process.
-
-\(fn)" t nil)
-
-(autoload 'helm-xrandr-set "helm-sys" "\
-Preconfigured helm for xrandr.
-
-\(fn)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-tags" "helm-tags.el" (22215 7711 0 0))
-;;; Generated autoloads from helm-tags.el
-
-(autoload 'helm-etags-select "helm-tags" "\
-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.
-
-\(fn REINIT)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil "helm-utils" "helm-utils.el" (22215 7711 0
-;;;;;; 0))
-;;; Generated autoloads from helm-utils.el
-
-(defvar helm-popup-tip-mode nil "\
-Non-nil if Helm-Popup-Tip mode is enabled.
-See the command `helm-popup-tip-mode' for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `helm-popup-tip-mode'.")
-
-(custom-autoload 'helm-popup-tip-mode "helm-utils" nil)
-
-(autoload 'helm-popup-tip-mode "helm-utils" "\
-Show help-echo informations in a popup tip at end of line.
-
-\(fn &optional ARG)" t nil)
-
-;;;***
-\f
-;;;### (autoloads nil nil ("helm-easymenu.el" "helm-multi-match.el"
-;;;;;; "helm-pkg.el" "helm-plugin.el" "helm-types.el") (22215 7711
-;;;;;; 934049 0))
-
-;;;***
-\f
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; End:
-;;; helm-autoloads.el ends here
+++ /dev/null
-;;; helm-bookmark.el --- Helm for Emacs regular Bookmarks. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'bookmark)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-types)
-(require 'helm-utils)
-(require 'helm-info)
-(require 'helm-adaptive)
-(require 'helm-net)
-
-(declare-function addressbook-bookmark-edit "ext:addressbook-bookmark.el" (bookmark))
-(declare-function message-buffers "message.el")
-(declare-function addressbook-set-mail-buffer-1 "ext:addressbook-bookmark.el"
- (&optional bookmark-name append cc))
-
-\f
-(defgroup helm-bookmark nil
- "Predefined configurations for `helm.el'."
- :group 'helm)
-
-(defcustom helm-bookmark-show-location nil
- "Show location of bookmark on display."
- :group 'helm-bookmark
- :type 'boolean)
-
-(defcustom helm-bookmark-default-filtered-sources
- (append '(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)
- (and (locate-library "addressbook-bookmark")
- (list 'helm-source-bookmark-addressbook))
- (list 'helm-source-bookmark-uncategorized
- 'helm-source-bookmark-set))
- "List of sources to use in `helm-filtered-bookmarks'."
- :group 'helm-bookmark
- :type '(repeat (choice symbol)))
-
-(defcustom helm-bookmark-addressbook-actions
- '(("Show Contact(s)"
- . (lambda (candidate)
- (let* ((contacts (helm-marked-candidates))
- (current-prefix-arg helm-current-prefix-arg))
- (bookmark-jump
- (helm-bookmark-get-bookmark-from-name (car contacts)))
- (helm-aif (cdr contacts)
- (let ((current-prefix-arg '(4)))
- (cl-loop for bmk in it do
- (bookmark-jump
- (helm-bookmark-get-bookmark-from-name bmk))))))))
- ("Mail To" . helm-bookmark-addressbook-send-mail-1)
- ("Mail Cc" . (lambda (_candidate)
- (helm-bookmark-addressbook-send-mail-1 nil 'cc)))
- ("Mail Bcc" . (lambda (_candidate)
- (helm-bookmark-addressbook-send-mail-1 nil 'bcc)))
- ("Edit Bookmark"
- . (lambda (candidate)
- (let ((bmk (helm-bookmark-get-bookmark-from-name
- candidate)))
- (addressbook-bookmark-edit
- (assoc bmk bookmark-alist)))))
- ("Delete bookmark(s)" . helm-delete-marked-bookmarks)
- ("Insert Email at point"
- . (lambda (candidate)
- (let* ((bmk (helm-bookmark-get-bookmark-from-name
- candidate))
- (mlist (split-string
- (assoc-default
- 'email (assoc bmk bookmark-alist))
- ", ")))
- (insert
- (if (> (length mlist) 1)
- (helm-comp-read
- "Insert Mail Address: " mlist :must-match t)
- (car mlist))))))
- ("Show annotation"
- . (lambda (candidate)
- (let ((bmk (helm-bookmark-get-bookmark-from-name
- candidate)))
- (bookmark-show-annotation bmk))))
- ("Edit annotation"
- . (lambda (candidate)
- (let ((bmk (helm-bookmark-get-bookmark-from-name
- candidate)))
- (bookmark-edit-annotation bmk))))
- ("Show Google map"
- . (lambda (candidate)
- (let* ((bmk (helm-bookmark-get-bookmark-from-name
- candidate))
- (full-bmk (assoc bmk bookmark-alist)))
- (addressbook-google-map full-bmk)))))
- "Actions for addressbook bookmarks."
- :group 'helm-bookmark
- :type '(alist :key-type string :value-type function))
-
-\f
-(defface helm-bookmark-info
- '((t (:foreground "green")))
- "Face used for W3m Emacs bookmarks (not w3m bookmarks)."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-w3m
- '((t (:foreground "yellow")))
- "Face used for W3m Emacs bookmarks (not w3m bookmarks)."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-gnus
- '((t (:foreground "magenta")))
- "Face used for Gnus bookmarks."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-man
- '((t (:foreground "Orange4")))
- "Face used for Woman/man bookmarks."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-file
- '((t (:foreground "Deepskyblue2")))
- "Face used for file bookmarks."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-directory
- '((t (:inherit helm-ff-directory)))
- "Face used for file bookmarks."
- :group 'helm-bookmark)
-
-(defface helm-bookmark-addressbook
- '((t (:foreground "tomato")))
- "Face used for addressbook bookmarks."
- :group 'helm-bookmark)
-
-\f
-(defvar helm-bookmark-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-c o") 'helm-bookmark-run-jump-other-window)
- (define-key map (kbd "C-d") 'helm-bookmark-run-delete)
- (define-key map (kbd "C-]") 'helm-bookmark-toggle-filename)
- (define-key map (kbd "M-e") 'helm-bookmark-run-edit)
- map)
- "Generic Keymap for emacs bookmark sources.")
-
-(defclass helm-source-basic-bookmarks (helm-source-in-buffer helm-type-bookmark)
- ((init :initform (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global
- (bookmark-all-names))))
- (filtered-candidate-transformer :initform 'helm-bookmark-transformer)))
-
-(defvar helm-source-bookmarks
- (helm-make-source "Bookmarks" 'helm-source-basic-bookmarks)
- "See (info \"(emacs)Bookmarks\").")
-
-(defun helm-bookmark-transformer (candidates _source)
- (cl-loop for i in candidates
- for loc = (bookmark-location i)
- for len = (string-width i)
- for trunc = (if (> len bookmark-bmenu-file-column)
- (helm-substring i bookmark-bmenu-file-column)
- i)
- for sep = (make-string (- (+ bookmark-bmenu-file-column 2)
- (length trunc))
- ? )
- if helm-bookmark-show-location
- collect (cons (concat trunc sep (if (listp loc) (car loc) loc)) i)
- else collect i))
-
-(defun helm-bookmark-toggle-filename-1 (_candidate)
- (let* ((real (helm-get-selection helm-buffer))
- (trunc (if (> (string-width real) bookmark-bmenu-file-column)
- (helm-substring real bookmark-bmenu-file-column)
- real))
- (loc (bookmark-location real)))
- (setq helm-bookmark-show-location (not helm-bookmark-show-location))
- (helm-update (if helm-bookmark-show-location
- (concat (regexp-quote trunc)
- " +"
- (regexp-quote
- (if (listp loc) (car loc) loc)))
- (regexp-quote real)))))
-
-(defun helm-bookmark-toggle-filename ()
- "Toggle bookmark location visibility."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'toggle-filename
- '(helm-bookmark-toggle-filename-1 . never-split))
- (helm-execute-persistent-action 'toggle-filename)))
-(put 'helm-bookmark-toggle-filename 'helm-only t)
-
-(defun helm-bookmark-jump (candidate)
- "Jump to bookmark from keyboard."
- (let ((current-prefix-arg helm-current-prefix-arg)
- non-essential)
- (bookmark-jump candidate)))
-
-(defun helm-bookmark-jump-other-window (candidate)
- (let (non-essential)
- (bookmark-jump-other-window candidate)))
-
-\f
-;;; bookmark-set
-;;
-(defvar helm-source-bookmark-set
- (helm-build-dummy-source "Set Bookmark"
- :filtered-candidate-transformer
- (lambda (_candidates _source)
- (list (or (and (not (string= helm-pattern ""))
- helm-pattern)
- "Enter a bookmark name to record")))
- :action '(("Set bookmark" . (lambda (candidate)
- (if (string= helm-pattern "")
- (message "No bookmark name given for record")
- (bookmark-set candidate))))))
- "See (info \"(emacs)Bookmarks\").")
-
-\f
-;;; Predicates
-;;
-(defconst helm-bookmark--non-file-filename " - no file -"
- "Name to use for `filename' entry, for non-file bookmarks.")
-
-(defun helm-bookmark-gnus-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a Gnus bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-gnus)
- (eq (bookmark-get-handler bookmark) 'gnus-summary-bookmark-jump)
- (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-gnus)))
-
-(defun helm-bookmark-w3m-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a W3m bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-w3m)
- (eq (bookmark-get-handler bookmark) 'bookmark-w3m-bookmark-jump)
- (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-w3m)))
-
-(defun helm-bookmark-woman-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a Woman bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-woman)
- (eq (bookmark-get-handler bookmark) 'woman-bookmark-jump)
- (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-woman)))
-
-(defun helm-bookmark-man-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a Man bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (eq (bookmark-get-handler bookmark) 'bmkext-jump-man)
- (eq (bookmark-get-handler bookmark) 'Man-bookmark-jump)
- (eq (bookmark-get-handler bookmark) 'bookmarkp-jump-man)))
-
-(defun helm-bookmark-woman-man-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is a Man or Woman bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (or (helm-bookmark-man-bookmark-p bookmark)
- (helm-bookmark-woman-bookmark-p bookmark)))
-
-(defun helm-bookmark-info-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK is an Info bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (eq (bookmark-get-handler bookmark) 'Info-bookmark-jump))
-
-(defun helm-bookmark-image-bookmark-p (bookmark)
- "Return non-nil if BOOKMARK bookmarks an image file."
- (if (stringp bookmark)
- (assoc 'image-type (assoc bookmark bookmark-alist))
- (assoc 'image-type bookmark)))
-
-(defun helm-bookmark-file-p (bookmark)
- "Return non-nil if BOOKMARK bookmarks a file or directory.
-BOOKMARK is a bookmark name or a bookmark record.
-This excludes bookmarks of a more specific kind (Info, Gnus, and W3m)."
- (let* ((filename (bookmark-get-filename bookmark))
- (isnonfile (equal filename helm-bookmark--non-file-filename)))
- (and filename (not isnonfile) (not (bookmark-get-handler bookmark)))))
-
-(defun helm-bookmark-helm-find-files-p (bookmark)
- "Return non-nil if BOOKMARK bookmarks a `helm-find-files' session.
-BOOKMARK is a bookmark name or a bookmark record."
- (eq (bookmark-get-handler bookmark) 'helm-ff-bookmark-jump))
-
-(defun helm-bookmark-addressbook-p (bookmark)
- "Return non--nil if BOOKMARK is a contact recorded with addressbook-bookmark.
-BOOKMARK is a bookmark name or a bookmark record."
- (if (listp bookmark)
- (string= (assoc-default 'type bookmark) "addressbook")
- (string= (assoc-default
- 'type (assoc bookmark bookmark-alist)) "addressbook")))
-
-(defun helm-bookmark-uncategorized-bookmark-p (bookmark)
- "Return non--nil if BOOKMARK match no known category."
- (cl-loop for pred in '(helm-bookmark-addressbook-p
- helm-bookmark-gnus-bookmark-p
- helm-bookmark-w3m-bookmark-p
- helm-bookmark-woman-man-bookmark-p
- helm-bookmark-info-bookmark-p
- helm-bookmark-image-bookmark-p
- helm-bookmark-file-p
- helm-bookmark-helm-find-files-p
- helm-bookmark-addressbook-p)
- never (funcall pred bookmark)))
-
-(defun helm-bookmark-filter-setup-alist (fn)
- "Return a filtered `bookmark-alist' sorted alphabetically."
- (cl-loop for b in bookmark-alist
- for name = (car b)
- when (funcall fn b) collect
- (propertize name 'location (bookmark-location name))))
-\f
-;;; Bookmark handlers
-;;
-(defvar w3m-async-exec)
-(defun helm-bookmark-jump-w3m (bookmark)
- "Jump to W3m bookmark BOOKMARK, setting a new tab.
-If `browse-url-browser-function' is set to something else
-than `w3m-browse-url' use it."
- (require 'helm-net)
- (let ((file (or (bookmark-prop-get bookmark 'filename)
- (bookmark-prop-get bookmark 'url)))
- (buf (generate-new-buffer-name "*w3m*"))
- (w3m-async-exec nil)
- (really-use-w3m (equal browse-url-browser-function 'w3m-browse-url)))
- (helm-browse-url file really-use-w3m)
- (when really-use-w3m
- (bookmark-default-handler
- `("" (buffer . ,buf) . ,(bookmark-get-bookmark-record bookmark))))))
-
-;; All bookmarks recorded with the handler provided with w3m
-;; (`bookmark-w3m-bookmark-jump') will use our handler which open
-;; the bookmark in a new tab or in an external browser depending
-;; on `browse-url-browser-function'.
-(defalias 'bookmark-w3m-bookmark-jump 'helm-bookmark-jump-w3m)
-
-;; Provide compatibility with old handlers provided in external
-;; packages bookmark-extensions.el and bookmark+.
-(defalias 'bmkext-jump-woman 'woman-bookmark-jump)
-(defalias 'bmkext-jump-man 'Man-bookmark-jump)
-(defalias 'bmkext-jump-w3m 'helm-bookmark-jump-w3m)
-(defalias 'bmkext-jump-gnus 'gnus-summary-bookmark-jump)
-(defalias 'bookmarkp-jump-gnus 'gnus-summary-bookmark-jump)
-(defalias 'bookmarkp-jump-w3m 'helm-bookmark-jump-w3m)
-(defalias 'bookmarkp-jump-woman 'woman-bookmark-jump)
-(defalias 'bookmarkp-jump-man 'Man-bookmark-jump)
-
-\f
-;;;; Filtered bookmark sources
-;;
-;;
-(defclass helm-source-filtered-bookmarks (helm-source-in-buffer helm-type-bookmark)
- ((filtered-candidate-transformer
- :initform '(helm-adaptive-sort
- helm-highlight-bookmark))))
-
-;;; W3m bookmarks.
-;;
-(defun helm-bookmark-w3m-setup-alist ()
- "Specialized filter function for bookmarks w3m."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-w3m-bookmark-p))
-
-(defvar helm-source-bookmark-w3m
- (helm-make-source "Bookmark W3m" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-w3m-setup-alist)))))
-
-;;; Images
-;;
-(defun helm-bookmark-images-setup-alist ()
- "Specialized filter function for images bookmarks."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-image-bookmark-p))
-
-(defvar helm-source-bookmark-images
- (helm-make-source "Bookmark Images" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-images-setup-alist)))))
-
-;;; Woman Man
-;;
-(defun helm-bookmark-man-setup-alist ()
- "Specialized filter function for bookmarks w3m."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-woman-man-bookmark-p))
-
-(defvar helm-source-bookmark-man
- (helm-make-source "Bookmark Woman&Man" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-man-setup-alist)))))
-
-;;; Gnus
-;;
-(defun helm-bookmark-gnus-setup-alist ()
- "Specialized filter function for bookmarks gnus."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-gnus-bookmark-p))
-
-(defvar helm-source-bookmark-gnus
- (helm-make-source "Bookmark Gnus" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-gnus-setup-alist)))))
-
-;;; Info
-;;
-(defun helm-bookmark-info-setup-alist ()
- "Specialized filter function for bookmarks info."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-info-bookmark-p))
-
-(defvar helm-source-bookmark-info
- (helm-make-source "Bookmark Info" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-info-setup-alist)))))
-
-;;; Files and directories
-;;
-(defun helm-bookmark-local-files-setup-alist ()
- "Specialized filter function for bookmarks locals files."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-file-p))
-
-(defvar helm-source-bookmark-files&dirs
- (helm-make-source "Bookmark Files&Directories" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-local-files-setup-alist)))))
-
-;;; Helm find files sessions.
-;;
-(defun helm-bookmark-helm-find-files-setup-alist ()
- "Specialized filter function for `helm-find-files' bookmarks."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-helm-find-files-p))
-
-(defvar helm-source-bookmark-helm-find-files
- (helm-make-source "Bookmark helm-find-files sessions" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-helm-find-files-setup-alist)))
- :persistent-action (lambda (_candidate) (ignore))
- :persistent-help "Do nothing"))
-
-;;; Uncategorized bookmarks
-;;
-(defun helm-bookmark-uncategorized-setup-alist ()
- "Specialized filter function for uncategorized bookmarks."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-uncategorized-bookmark-p))
-
-(defvar helm-source-bookmark-uncategorized
- (helm-make-source "Bookmark uncategorized" 'helm-source-filtered-bookmarks
- :init (lambda ()
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global (helm-bookmark-uncategorized-setup-alist)))))
-
-;;; Addressbook.
-;;
-;;
-(defclass helm-bookmark-addressbook-class (helm-source-in-buffer)
- ((init :initform (lambda ()
- (require 'addressbook-bookmark nil t)
- (bookmark-maybe-load-default-file)
- (helm-init-candidates-in-buffer
- 'global
- (helm-bookmark-addressbook-setup-alist))))
- (persistent-action :initform
- (lambda (candidate)
- (let ((bmk (helm-bookmark-get-bookmark-from-name
- candidate)))
- (bookmark--jump-via bmk 'switch-to-buffer))))
- (persistent-help :initform "Show contact - Prefix with C-u to append")
- (filtered-candidate-transformer :initform
- '(helm-adaptive-sort
- helm-highlight-bookmark))
- (action :initform 'helm-bookmark-addressbook-actions)))
-
-(defun helm-bookmark-addressbook-send-mail-1 (_candidate &optional cc)
- (let* ((contacts (helm-marked-candidates))
- (bookmark (helm-bookmark-get-bookmark-from-name
- (car contacts)))
- (append (message-buffers)))
- (addressbook-set-mail-buffer-1 bookmark append)
- (helm-aif (cdr contacts)
- (progn
- (when cc (addressbook-set-mail-buffer-1 (car it) nil cc))
- (cl-loop for bmk in (cdr it) do
- (addressbook-set-mail-buffer-1
- (helm-bookmark-get-bookmark-from-name bmk) 'append cc))))))
-
-(defun helm-bookmark-addressbook-setup-alist ()
- "Specialized filter function for addressbook bookmarks."
- (helm-bookmark-filter-setup-alist 'helm-bookmark-addressbook-p))
-
-(defvar helm-source-bookmark-addressbook
- (helm-make-source "Bookmark Addressbook" 'helm-bookmark-addressbook-class))
-
-;;; Transformer
-;;
-\f
-(defun helm-highlight-bookmark (bookmarks _source)
- "Used as `filtered-candidate-transformer' to colorize bookmarks.
-Work both with standard Emacs bookmarks and bookmark-extensions.el."
- (let ((non-essential t))
- (cl-loop for i in bookmarks
- for isfile = (bookmark-get-filename i)
- for hff = (helm-bookmark-helm-find-files-p i)
- for handlerp = (and (fboundp 'bookmark-get-handler)
- (bookmark-get-handler i))
- for isw3m = (and (fboundp 'helm-bookmark-w3m-bookmark-p)
- (helm-bookmark-w3m-bookmark-p i))
- for isgnus = (and (fboundp 'helm-bookmark-gnus-bookmark-p)
- (helm-bookmark-gnus-bookmark-p i))
- for isman = (and (fboundp 'helm-bookmark-man-bookmark-p) ; Man
- (helm-bookmark-man-bookmark-p i))
- for iswoman = (and (fboundp 'helm-bookmark-woman-bookmark-p) ; Woman
- (helm-bookmark-woman-bookmark-p i))
- for isannotation = (bookmark-get-annotation i)
- for isabook = (string= (bookmark-prop-get i 'type)
- "addressbook")
- for isinfo = (eq handlerp 'Info-bookmark-jump)
- for loc = (bookmark-location i)
- for len = (string-width i)
- for trunc = (if (and helm-bookmark-show-location
- (> len bookmark-bmenu-file-column))
- (helm-substring
- i bookmark-bmenu-file-column)
- i)
- ;; Add a * if bookmark have annotation
- if (and isannotation (not (string-equal isannotation "")))
- do (setq trunc (concat "*" (if helm-bookmark-show-location trunc i)))
- for sep = (and helm-bookmark-show-location
- (make-string (- (+ bookmark-bmenu-file-column 2)
- (string-width trunc))
- ? ))
- for bmk = (cond ( ;; info buffers
- isinfo
- (propertize trunc 'face 'helm-bookmark-info
- 'help-echo isfile))
- ( ;; w3m buffers
- isw3m
- (propertize trunc 'face 'helm-bookmark-w3m
- 'help-echo isfile))
- ( ;; gnus buffers
- isgnus
- (propertize trunc 'face 'helm-bookmark-gnus
- 'help-echo isfile))
- ( ;; Man Woman
- (or iswoman isman)
- (propertize trunc 'face 'helm-bookmark-man
- 'help-echo isfile))
- ( ;; Addressbook
- isabook
- (propertize trunc 'face 'helm-bookmark-addressbook))
- ( ;; directories
- (and isfile
- (or hff
- ;; This is needed because `non-essential'
- ;; is not working on Emacs-24.2 and the behavior
- ;; of tramp seems to have changed since previous
- ;; versions (Need to reenter password even if a
- ;; first connection have been established,
- ;; probably when host is named differently
- ;; i.e machine/localhost)
- (and (not (file-remote-p isfile))
- (file-directory-p isfile))))
- (propertize trunc 'face 'helm-bookmark-directory
- 'help-echo isfile))
- ( ;; regular files
- t
- (propertize trunc 'face 'helm-bookmark-file
- 'help-echo isfile)))
- collect (if helm-bookmark-show-location
- (cons (concat bmk sep (if (listp loc) (car loc) loc))
- i)
- (cons bmk i)))))
-
-\f
-;;; Edit/rename/save bookmarks.
-;;
-;;
-(defun helm-bookmark-edit-bookmark (bookmark-name)
- "Edit bookmark's name and file name, and maybe save them.
-BOOKMARK-NAME is the current (old) name of the bookmark to be renamed."
- (let ((bmk (helm-bookmark-get-bookmark-from-name bookmark-name))
- (handler (bookmark-prop-get bookmark-name 'handler)))
- (if (eq handler 'addressbook-bookmark-jump)
- (addressbook-bookmark-edit
- (assoc bmk bookmark-alist))
- (helm-bookmark-edit-bookmark-1 bookmark-name handler))))
-
-(defun helm-bookmark-edit-bookmark-1 (bookmark-name handler)
- (let* ((helm--reading-passwd-or-string t)
- (bookmark-fname (bookmark-get-filename bookmark-name))
- (bookmark-loc (bookmark-prop-get bookmark-name 'location))
- (new-name (read-from-minibuffer "Name: " bookmark-name))
- (new-loc (read-from-minibuffer "FileName or Location: "
- (or bookmark-fname
- (if (consp bookmark-loc)
- (car bookmark-loc)
- bookmark-loc))))
- (docid (and (eq handler 'mu4e-bookmark-jump)
- (read-number "Docid: " (cdr bookmark-loc)))))
- (when docid
- (setq new-loc (cons new-loc docid)))
- (when (and (not (equal new-name "")) (not (equal new-loc ""))
- (y-or-n-p "Save changes? "))
- (if bookmark-fname
- (progn
- (helm-bookmark-rename bookmark-name new-name 'batch)
- (bookmark-set-filename new-name new-loc))
- (bookmark-prop-set
- (bookmark-get-bookmark bookmark-name) 'location new-loc)
- (helm-bookmark-rename bookmark-name new-name 'batch))
- (helm-bookmark-maybe-save-bookmark)
- (list new-name new-loc))))
-
-(defun helm-bookmark-maybe-save-bookmark ()
- "Increment save counter and maybe save `bookmark-alist'."
- (setq bookmark-alist-modification-count (1+ bookmark-alist-modification-count))
- (when (bookmark-time-to-save-p) (bookmark-save)))
-
-(defun 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."
- (interactive (list (bookmark-completing-read "Old bookmark name")))
- (bookmark-maybe-historicize-string old)
- (bookmark-maybe-load-default-file)
- (save-excursion (skip-chars-forward " ") (setq bookmark-yank-point (point)))
- (setq bookmark-current-buffer (current-buffer))
- (let ((newname (or new (read-from-minibuffer
- "New name: " nil
- (let ((now-map (copy-keymap minibuffer-local-map)))
- (define-key now-map "\C-w" 'bookmark-yank-word)
- now-map)
- nil 'bookmark-history))))
- (bookmark-set-name old newname)
- (setq bookmark-current-bookmark newname)
- (unless batch (bookmark-bmenu-surreptitiously-rebuild-list))
- (helm-bookmark-maybe-save-bookmark) newname))
-
-(defun helm-bookmark-run-edit ()
- "Run `helm-bookmark-edit-bookmark' from keyboard."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-bookmark-edit-bookmark)))
-(put 'helm-bookmark-run-edit 'helm-only t)
-
-\f
-(defun helm-bookmark-run-jump-other-window ()
- "Jump to bookmark from keyboard."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'bookmark-jump-other-window)))
-(put 'helm-bookmark-run-jump-other-window 'helm-only t)
-
-(defun helm-bookmark-run-delete ()
- "Delete bookmark from keyboard."
- (interactive)
- (with-helm-alive-p
- (when (y-or-n-p "Delete bookmark(s)?")
- (helm-exit-and-execute-action 'helm-delete-marked-bookmarks))))
-(put 'helm-bookmark-run-delete 'helm-only t)
-
-(defun helm-bookmark-get-bookmark-from-name (bmk)
- "Return bookmark name even if it is a bookmark with annotation.
-e.g prepended with *."
- (let ((bookmark (replace-regexp-in-string "\\`\\*" "" bmk)))
- (if (assoc bookmark bookmark-alist) bookmark bmk)))
-
-(defun helm-delete-marked-bookmarks (_ignore)
- "Delete this bookmark or all marked bookmarks."
- (cl-dolist (i (helm-marked-candidates))
- (bookmark-delete (helm-bookmark-get-bookmark-from-name i)
- 'batch)))
-
-
-;;;###autoload
-(defun helm-bookmarks ()
- "Preconfigured `helm' for bookmarks."
- (interactive)
- (helm :sources '(helm-source-bookmarks
- helm-source-bookmark-set)
- :buffer "*helm bookmarks*"
- :default (buffer-name helm-current-buffer)))
-
-;;;###autoload
-(defun helm-filtered-bookmarks ()
- "Preconfigured helm for bookmarks (filtered by category).
-Optional source `helm-source-bookmark-addressbook' is loaded
-only if external library addressbook-bookmark.el is available."
- (interactive)
- (helm :sources helm-bookmark-default-filtered-sources
- :prompt "Search Bookmark: "
- :buffer "*helm filtered bookmarks*"
- :default (list (thing-at-point 'symbol)
- (buffer-name helm-current-buffer))))
-
-(provide 'helm-bookmark)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-bookmark.el ends here
+++ /dev/null
-;;; helm-buffers.el --- helm support for buffers. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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:
-\f
-(require 'cl-lib)
-(require 'helm)
-(require 'helm-types)
-(require 'helm-utils)
-(require 'helm-elscreen)
-(require 'helm-grep)
-(require 'helm-plugin)
-(require 'helm-regexp)
-(require 'helm-help)
-
-(declare-function ido-make-buffer-list "ido" (default))
-(declare-function ido-add-virtual-buffers-to-list "ido")
-(declare-function helm-comp-read "helm-mode")
-
-\f
-(defgroup helm-buffers nil
- "Buffers related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-boring-buffer-regexp-list
- '("\\` " "\\*helm" "\\*helm-mode" "\\*Echo Area" "\\*Minibuf")
- "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."
- :type '(repeat (choice regexp))
- :group 'helm-buffers)
-
-(defcustom helm-white-buffer-regexp-list nil
- "The regexp list of not boring buffers.
-These buffers will be displayed even if they match one of
-`helm-boring-buffer-regexp-list'."
- :type '(repeat (choice regexp))
- :group 'helm-buffers)
-
-(defcustom helm-buffers-favorite-modes '(lisp-interaction-mode
- emacs-lisp-mode
- text-mode
- org-mode)
- "List of preferred mode to open new buffers with."
- :type '(repeat (choice function))
- :group 'helm-buffers)
-
-(defcustom helm-buffer-max-length 20
- "Max length of buffer names before truncate.
-When disabled (nil) use the longest buffer-name length found."
- :group 'helm-buffers
- :type '(choice (const :tag "Disabled" nil)
- (integer :tag "Length before truncate")))
-
-(defcustom helm-buffer-details-flag t
- "Always show details in buffer list when non--nil."
- :group 'helm-buffers
- :type 'boolean)
-
-(defcustom helm-buffers-fuzzy-matching 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."
- :group 'helm-buffers
- :type 'boolean)
-
-(defcustom helm-buffer-skip-remote-checking nil
- "Ignore checking for `file-exists-p' on remote files."
- :group 'helm-buffers
- :type 'boolean)
-
-(defcustom helm-buffers-truncate-lines t
- "Truncate lines in `helm-buffers-list' when non--nil."
- :group 'helm-buffers
- :type 'boolean)
-
-(defcustom helm-mini-default-sources '(helm-source-buffers-list
- helm-source-recentf
- helm-source-buffer-not-found)
- "Default sources list used in `helm-mini'."
- :group 'helm-buffers
- :type '(repeat (choice symbol)))
-
-(defcustom helm-buffers-end-truncated-string "..."
- "The string to display at end of truncated buffer names."
- :type 'string
- :group 'helm-buffers)
-
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-buffers-faces nil
- "Customize the appearance of helm-buffers."
- :prefix "helm-"
- :group 'helm-buffers
- :group 'helm-faces)
-
-(defface helm-buffer-saved-out
- '((t (:foreground "red" :background "black")))
- "Face used for buffer files modified outside of emacs."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-not-saved
- '((t (:foreground "Indianred2")))
- "Face used for buffer files not already saved on disk."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-size
- '((((background dark)) :foreground "RosyBrown")
- (((background light)) :foreground "SlateGray"))
- "Face used for buffer size."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-process
- '((t (:foreground "Sienna3")))
- "Face used for process status in buffer."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-directory
- '((t (:foreground "DarkRed" :background "LightGray")))
- "Face used for directories in `helm-buffers-list'."
- :group 'helm-buffers-faces)
-
-(defface helm-buffer-file
- '((t :inherit font-lock-builtin-face))
- "Face for buffer file names in `helm-buffers-list'."
- :group 'helm-buffers-faces)
-
-\f
-;;; Buffers keymap
-;;
-(defvar helm-buffer-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- ;; No need to have separate command for grep and zgrep
- ;; as we don't use recursivity for buffers.
- ;; So use zgrep for both as it is capable to handle non--compressed files.
- (define-key map (kbd "M-g s") 'helm-buffer-run-zgrep)
- (define-key map (kbd "C-s") 'helm-buffers-run-multi-occur)
- (define-key map (kbd "C-c o") 'helm-buffer-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-buffer-switch-other-frame)
- (define-key map (kbd "C-c =") 'helm-buffer-run-ediff)
- (define-key map (kbd "M-=") 'helm-buffer-run-ediff-merge)
- (define-key map (kbd "C-=") 'helm-buffer-diff-persistent)
- (define-key map (kbd "M-U") 'helm-buffer-revert-persistent)
- (define-key map (kbd "C-c d") 'helm-buffer-run-kill-persistent)
- (define-key map (kbd "M-D") 'helm-buffer-run-kill-buffers)
- (define-key map (kbd "C-x C-s") 'helm-buffer-save-persistent)
- (define-key map (kbd "C-M-%") 'helm-buffer-run-query-replace-regexp)
- (define-key map (kbd "M-%") 'helm-buffer-run-query-replace)
- (define-key map (kbd "M-m") 'helm-toggle-all-marks)
- (define-key map (kbd "M-a") 'helm-mark-all)
- (define-key map (kbd "C-]") 'helm-toggle-buffers-details)
- (define-key map (kbd "C-c a") 'helm-buffers-toggle-show-hidden-buffers)
- (define-key map (kbd "<C-M-SPC>") 'helm-buffers-mark-similar-buffers)
- map)
- "Keymap for buffer sources in helm.")
-
-(defvar helm-buffers-ido-virtual-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-c o") 'helm-ff-run-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-ff-run-switch-other-frame)
- (define-key map (kbd "M-g s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g z") 'helm-ff-run-zgrep)
- (define-key map (kbd "M-D") 'helm-ff-run-delete-file)
- (define-key map (kbd "C-c C-x") 'helm-ff-run-open-file-externally)
- map))
-
-\f
-(defvar helm-buffers-list-cache nil)
-(defvar helm-buffer-max-len-mode nil)
-
-(defun helm-buffers-list--init ()
- ;; Issue #51 Create the list before `helm-buffer' creation.
- (setq helm-buffers-list-cache (funcall (helm-attr 'buffer-list)))
- (let ((result (cl-loop for b in helm-buffers-list-cache
- maximize (length b) into len-buf
- maximize (length (with-current-buffer b
- (format-mode-line mode-name)))
- into len-mode
- finally return (cons len-buf len-mode))))
- (unless (default-value 'helm-buffer-max-length)
- (helm-set-local-variable 'helm-buffer-max-length (car result)))
- (unless (default-value 'helm-buffer-max-len-mode)
- (helm-set-local-variable 'helm-buffer-max-len-mode (cdr result)))))
-
-(defclass helm-source-buffers (helm-source-sync helm-type-buffer)
- ((buffer-list
- :initarg :buffer-list
- :initform #'helm-buffer-list
- :custom function
- :documentation
- " A function with no arguments to create buffer list.")
- (init :initform 'helm-buffers-list--init)
- (candidates :initform helm-buffers-list-cache)
- (matchplugin :initform nil)
- (match :initform 'helm-buffers-match-function)
- (persistent-action :initform 'helm-buffers-list-persistent-action)
- (resume :initform (lambda ()
- (run-with-idle-timer
- 0.1 nil (lambda ()
- (with-helm-buffer
- (helm-force-update))))))
- (keymap :initform helm-buffer-map)
- (migemo :initform 'nomultimatch)
- (volatile :initform t)
- (help-message :initform 'helm-buffer-help-message)
- (persistent-help
- :initform
- "Show this buffer / C-u \\[helm-execute-persistent-action]: Kill this buffer")))
-
-(defvar helm-source-buffers-list nil)
-
-(defvar helm-source-buffer-not-found
- (helm-build-dummy-source
- "Create buffer"
- :action (helm-make-actions
- "Create buffer (C-u choose mode)"
- (lambda (candidate)
- (let ((mjm (or (and helm-current-prefix-arg
- (intern-soft (helm-comp-read
- "Major-mode: "
- helm-buffers-favorite-modes)))
- (cl-loop for (r . m) in auto-mode-alist
- when (string-match r candidate)
- return m)))
- (buffer (get-buffer-create candidate)))
- (if mjm
- (with-current-buffer buffer (funcall mjm))
- (set-buffer-major-mode buffer))
- (switch-to-buffer buffer))))))
-
-(defvar ido-temp-list)
-(defvar ido-ignored-list)
-(defvar ido-process-ignore-lists)
-(defvar ido-use-virtual-buffers)
-(defvar ido-virtual-buffers)
-
-(defvar helm-source-ido-virtual-buffers
- (helm-build-sync-source "Ido virtual buffers"
- :candidates (lambda ()
- (let (ido-temp-list
- ido-ignored-list
- (ido-process-ignore-lists t))
- (when ido-use-virtual-buffers
- (ido-add-virtual-buffers-to-list)
- ido-virtual-buffers)))
- :fuzzy-match helm-buffers-fuzzy-matching
- :keymap helm-buffers-ido-virtual-map
- :help-message 'helm-buffers-ido-virtual-help-message
- :action '(("Find file" . helm-find-many-files)
- ("Find file other window" . find-file-other-window)
- ("Find file other frame" . find-file-other-frame)
- ("Find file as root" . helm-find-file-as-root)
- ("Grep File(s) `C-u recurse'" . helm-find-files-grep)
- ("Zgrep File(s) `C-u Recurse'" . helm-ff-zgrep)
- ("View file" . view-file)
- ("Delete file(s)" . helm-delete-marked-files)
- ("Open file externally (C-u to choose)"
- . helm-open-file-externally))))
-
-\f
-(defvar ido-use-virtual-buffers)
-(defvar ido-ignore-buffers)
-(defun helm-buffer-list ()
- "Return the current list of buffers.
-Currently visible buffers are put at the end of the list.
-See `ido-make-buffer-list' for more infos."
- (require 'ido)
- (let ((ido-process-ignore-lists t)
- ido-ignored-list
- ido-ignore-buffers
- ido-use-virtual-buffers)
- (ido-make-buffer-list nil)))
-
-(defun helm-buffer-size (buffer)
- "Return size of BUFFER."
- (with-current-buffer buffer
- (save-restriction
- (widen)
- (helm-file-human-size
- (- (position-bytes (point-max))
- (position-bytes (point-min)))))))
-
-(defun helm-buffer--show-details (buf-name prefix help-echo
- size mode dir face1 face2
- proc details type)
- (append
- (list
- (concat prefix
- (propertize buf-name 'face face1
- 'help-echo help-echo
- 'type type)))
- (and details
- (list size mode
- (propertize
- (if proc
- (format "(%s %s in `%s')"
- (process-name proc)
- (process-status proc) dir)
- (format "(in `%s')" dir))
- 'face face2)))))
-
-(defun helm-buffer--details (buffer &optional details)
- (let* ((mode (with-current-buffer buffer (format-mode-line mode-name)))
- (buf (get-buffer buffer))
- (size (propertize (helm-buffer-size buf)
- 'face 'helm-buffer-size))
- (proc (get-buffer-process buf))
- (dir (with-current-buffer buffer (abbreviate-file-name default-directory)))
- (file-name (helm-aif (buffer-file-name buf) (abbreviate-file-name it)))
- (name (buffer-name buf))
- (name-prefix (when (file-remote-p dir)
- (propertize "@ " 'face 'helm-ff-prefix))))
- ;; No fancy things on remote buffers.
- (if (and name-prefix helm-buffer-skip-remote-checking)
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-buffer-file 'helm-buffer-process nil details 'filebuf)
- (cond
- ( ;; A dired buffer.
- (rassoc buf dired-buffers)
- (helm-buffer--show-details
- name name-prefix dir size mode dir
- 'helm-buffer-directory 'helm-buffer-process nil details 'dired))
- ;; A buffer file modified somewhere outside of emacs.=>red
- ((and file-name
- (file-exists-p file-name)
- (not (verify-visited-file-modtime buf)))
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-buffer-saved-out 'helm-buffer-process nil details 'modout))
- ;; A new buffer file not already saved on disk (or a deleted file) .=>indianred2
- ((and file-name (not (file-exists-p file-name)))
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-buffer-not-saved 'helm-buffer-process nil details 'notsaved))
- ;; A buffer file modified and not saved on disk.=>orange
- ((and file-name (buffer-modified-p buf))
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-ff-symlink 'helm-buffer-process nil details 'mod))
- ;; A buffer file not modified and saved on disk.=>green
- (file-name
- (helm-buffer--show-details
- name name-prefix file-name size mode dir
- 'helm-buffer-file 'helm-buffer-process nil details 'filebuf))
- ;; Any non--file buffer.=>grey italic
- (t
- (helm-buffer--show-details
- name (and proc name-prefix) dir size mode dir
- 'italic 'helm-buffer-process proc details 'nofile))))))
-
-(defun helm-highlight-buffers (buffers _source)
- "Transformer function to highlight BUFFERS list.
-Should be called after others transformers i.e (boring buffers)."
- (cl-loop for i in buffers
- for (name size mode meta) = (if helm-buffer-details-flag
- (helm-buffer--details i 'details)
- (helm-buffer--details i))
- for truncbuf = (if (> (string-width name) helm-buffer-max-length)
- (helm-substring-by-width
- name helm-buffer-max-length
- helm-buffers-end-truncated-string)
- (concat name
- (make-string
- (- (+ helm-buffer-max-length
- (length helm-buffers-end-truncated-string))
- (string-width name)) ? )))
- for len = (length mode)
- when (> len helm-buffer-max-len-mode)
- do (setq helm-buffer-max-len-mode len)
- for fmode = (concat (make-string
- (- (max helm-buffer-max-len-mode len) len) ? )
- mode)
- ;; The max length of a number should be 1023.9X where X is the
- ;; units, this is 7 characters.
- for formatted-size = (and size (format "%7s" size))
- collect (cons (if helm-buffer-details-flag
- (concat truncbuf "\t" formatted-size
- " " fmode " " meta)
- name)
- (get-buffer i))))
-
-(defun helm-buffer--get-preselection (buffer)
- (let ((bufname (buffer-name buffer)))
- (concat "^"
- (if (and (null helm-buffer-details-flag)
- (numberp helm-buffer-max-length)
- (> (string-width bufname)
- helm-buffer-max-length))
- (regexp-quote
- (helm-substring-by-width
- bufname helm-buffer-max-length
- helm-buffers-end-truncated-string))
- (concat (regexp-quote bufname)
- (if helm-buffer-details-flag
- "$" "[[:blank:]]+"))))))
-
-(defun helm-toggle-buffers-details ()
- (interactive)
- (with-helm-alive-p
- (let ((preselect (helm-buffer--get-preselection
- (helm-get-selection))))
- (setq helm-buffer-details-flag (not helm-buffer-details-flag))
- (helm-force-update preselect))))
-(put 'helm-toggle-buffers-details 'helm-only t)
-
-(defun helm-buffers-sort-transformer (candidates _source)
- (if (string= helm-pattern "")
- candidates
- (sort candidates
- (lambda (s1 s2)
- (< (string-width s1) (string-width s2))))))
-
-(defun helm-buffers-mark-similar-buffers-1 ()
- (with-helm-window
- (let ((type (get-text-property
- 0 'type (helm-get-selection nil 'withprop))))
- (save-excursion
- (goto-char (helm-get-previous-header-pos))
- (helm-next-line)
- (let* ((next-head (helm-get-next-header-pos))
- (end (and next-head
- (save-excursion
- (goto-char next-head)
- (forward-line -1)
- (point))))
- (maxpoint (or end (point-max))))
- (while (< (point) maxpoint)
- (helm-mark-current-line)
- (let ((cand (helm-get-selection nil 'withprop)))
- (when (and (not (helm-this-visible-mark))
- (eq (get-text-property 0 'type cand) type))
- (helm-make-visible-mark)))
- (forward-line 1) (end-of-line))))
- (helm-mark-current-line)
- (helm-display-mode-line (helm-get-current-source) t)
- (message "%s candidates marked" (length helm-marked-candidates)))))
-
-(defun helm-buffers-mark-similar-buffers ()
- "Mark All buffers that have same property `type' than current.
-i.e same color."
- (interactive)
- (with-helm-alive-p
- (let ((marked (helm-marked-candidates)))
- (if (and (>= (length marked) 1)
- (with-helm-window helm-visible-mark-overlays))
- (helm-unmark-all)
- (helm-buffers-mark-similar-buffers-1)))))
-(put 'helm-buffers-mark-similar-buffers 'helm-only t)
-
-\f
-;;; match functions
-;;
-(defun helm-buffer--match-mjm (pattern mjm)
- (when (string-match "\\`\\*" pattern)
- (cl-loop with patterns = (split-string (substring pattern 1) ",")
- for pat in patterns
- if (string-match "\\`!" pat)
- collect (string-match (substring pat 1) mjm) into neg
- else collect (string-match pat mjm) into pos
- finally return
- (let ((neg-test (cl-loop for i in neg thereis (numberp i)))
- (pos-test (cl-loop for i in pos thereis (numberp i))))
- (or
- (and neg (not pos) (not neg-test))
- (and pos pos-test)
- (and neg neg-test (not neg-test)))))))
-
-(defun helm-buffer--match-pattern (pattern candidate)
- (let ((bfn (if (and helm-buffers-fuzzy-matching
- (not helm-migemo-mode)
- (not (string-match "\\`\\^" pattern)))
- #'helm--mapconcat-pattern
- #'identity))
- (mfn (if helm-migemo-mode
- #'helm-mm-migemo-string-match #'string-match)))
- (if (string-match "\\`!" pattern)
- (not (funcall mfn (funcall bfn (substring pattern 1))
- candidate))
- (funcall mfn (funcall bfn pattern) candidate))))
-
-(defun helm-buffers--match-from-mjm (candidate)
- (let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate))
- (buf (get-buffer cand))
- (regexp (cl-loop with pattern = helm-pattern
- for p in (split-string pattern)
- when (string-match "\\`\\*" p)
- return p)))
- (if regexp
- (when buf
- (with-current-buffer buf
- (let ((mjm (format-mode-line mode-name)))
- (helm-buffer--match-mjm regexp mjm))))
- t)))
-
-(defun helm-buffers--match-from-pat (candidate)
- (let ((regexp-list (cl-loop with pattern = helm-pattern
- for p in (split-string pattern)
- unless (string-match
- "\\`\\(\\*\\)\\|\\(/\\)\\|\\(@\\)" p)
- collect p)))
- (if regexp-list
- (cl-loop for re in regexp-list
- always (helm-buffer--match-pattern re candidate))
- t)))
-
-(defun helm-buffers--match-from-inside (candidate)
- (let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate))
- (buf (get-buffer cand))
- (regexp (cl-loop with pattern = helm-pattern
- for p in (split-string pattern)
- when (string-match "\\`@\\(.*\\)" p)
- return (match-string 1 p))))
- (if (and buf regexp)
- (with-current-buffer buf
- (save-excursion
- (goto-char (point-min))
- (if helm-migemo-mode
- (helm-mm-migemo-forward regexp nil t)
- (re-search-forward regexp nil t))))
- t)))
-
-(defun helm-buffers--match-from-directory (candidate)
- (let* ((cand (replace-regexp-in-string "^\\s-\\{1\\}" "" candidate))
- (buf (get-buffer cand))
- (buf-fname (buffer-file-name buf))
- (regexps (cl-loop with pattern = helm-pattern
- for p in (split-string pattern)
- when (string-match "\\`/" p)
- collect p)))
- (if regexps
- (cl-loop for re in regexps
- thereis
- (and buf-fname
- (string-match
- (substring re 1) (helm-basedir buf-fname))))
- t)))
-
-(defun helm-buffers-match-function (candidate)
- "Default function to match buffers."
- (and (helm-buffers--match-from-pat candidate)
- (helm-buffers--match-from-mjm candidate)
- (helm-buffers--match-from-inside candidate)
- (helm-buffers--match-from-directory candidate)))
-
-\f
-(defun helm-buffer-query-replace-1 (&optional regexp-flag buffers)
- "Query replace in marked buffers.
-If REGEXP-FLAG is given use `query-replace-regexp'."
- (let ((prompt (if regexp-flag "Query replace regexp" "Query replace"))
- (bufs (or buffers (helm-marked-candidates)))
- (helm--reading-passwd-or-string t))
- (cl-loop with args = (query-replace-read-args prompt regexp-flag t)
- for buf in bufs
- do
- (save-window-excursion
- (switch-to-buffer buf)
- (save-excursion
- (let ((case-fold-search t))
- (goto-char (point-min))
- (apply #'perform-replace
- (list (nth 0 args) (nth 1 args)
- t regexp-flag (nth 2 args) nil
- multi-query-replace-map))))))))
-
-(defun helm-buffer-query-replace-regexp (_candidate)
- (helm-buffer-query-replace-1 'regexp))
-
-(defun helm-buffer-query-replace (_candidate)
- (helm-buffer-query-replace-1))
-
-(defun helm-buffer-toggle-diff (candidate)
- "Toggle diff buffer CANDIDATE with it's file."
- (let (helm-persistent-action-use-special-display)
- (helm-aif (get-buffer-window "*Diff*")
- (progn (kill-buffer "*Diff*")
- (set-window-buffer it helm-current-buffer))
- (diff-buffer-with-file (get-buffer candidate)))))
-
-(defun helm-buffer-diff-persistent ()
- "Toggle diff buffer without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'diff-action 'helm-buffer-toggle-diff)
- (helm-execute-persistent-action 'diff-action)))
-(put 'helm-buffer-diff-persistent 'helm-only t)
-
-(defun helm-revert-buffer (candidate)
- (with-current-buffer candidate
- (helm-aif (buffer-file-name)
- (and (file-exists-p it) (revert-buffer t t)))))
-
-(defun helm-revert-marked-buffers (_ignore)
- (mapc 'helm-revert-buffer (helm-marked-candidates)))
-
-(defun helm-buffer-revert-and-update (_candidate)
- (let ((marked (helm-marked-candidates))
- (preselect (helm-buffers--quote-truncated-buffer
- (helm-get-selection))))
- (cl-loop for buf in marked do (helm-revert-buffer buf))
- (when (> (length marked) 1) (helm-unmark-all))
- (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-execute-persistent-action 'revert-action)))
-(put 'helm-buffer-revert-persistent 'helm-only t)
-
-(defun helm-buffer-save-and-update (_candidate)
- (let ((marked (helm-marked-candidates))
- (preselect (helm-get-selection nil t))
- (enable-recursive-minibuffers t))
- (cl-loop for buf in marked do
- (with-current-buffer (get-buffer buf)
- (when (buffer-file-name) (save-buffer))))
- (when (> (length marked) 1) (helm-unmark-all))
- (helm-force-update (regexp-quote preselect))))
-
-(defun helm-buffer-save-persistent ()
- "Save buffer without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'save-action '(helm-buffer-save-and-update . never-split))
- (helm-execute-persistent-action 'save-action)))
-(put 'helm-buffer-save-persistent 'helm-only t)
-
-(defun helm-buffer-run-kill-persistent ()
- "Kill buffer without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'kill-action '(helm-buffers-persistent-kill . never-split))
- (helm-execute-persistent-action 'kill-action)))
-(put 'helm-buffer-run-kill-persistent 'helm-only t)
-
-(defun helm-kill-marked-buffers (_ignore)
- (let* ((bufs (helm-marked-candidates))
- (killed-bufs (cl-count-if 'kill-buffer bufs)))
- (with-helm-buffer
- (setq helm-marked-candidates nil
- helm-visible-mark-overlays nil))
- (message "Killed %s buffer(s)" killed-bufs)))
-
-(defun helm-buffer-run-kill-buffers ()
- "Run kill buffer action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-kill-marked-buffers)))
-(put 'helm-buffer-run-kill-buffers 'helm-only t)
-
-(defun helm-buffer-run-grep ()
- "Run Grep action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-buffers)))
-(put 'helm-buffer-run-grep 'helm-only t)
-
-(defun helm-buffer-run-zgrep ()
- "Run Grep action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-zgrep-buffers)))
-(put 'helm-buffer-run-zgrep 'helm-only t)
-
-(defun helm-buffer-run-query-replace-regexp ()
- "Run Query replace regexp action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-buffer-query-replace-regexp)))
-(put 'helm-buffer-run-query-replace-regexp 'helm-only t)
-
-(defun helm-buffer-run-query-replace ()
- "Run Query replace action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-buffer-query-replace)))
-(put 'helm-buffer-run-query-replace 'helm-only t)
-
-(defun helm-buffer-switch-other-window ()
- "Run switch to other window action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-switch-to-buffers-other-window)))
-(put 'helm-buffer-switch-other-window 'helm-only t)
-
-(defun helm-buffer-switch-other-frame ()
- "Run switch to other frame action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'switch-to-buffer-other-frame)))
-(put 'helm-buffer-switch-other-frame 'helm-only t)
-
-(defun helm-buffer-switch-to-elscreen ()
- "Run switch to elscreen action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-buffer-on-elscreen)))
-(put 'helm-buffer-switch-to-elscreen 'helm-only t)
-
-(defun helm-buffer-run-ediff ()
- "Run ediff action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ediff-marked-buffers)))
-(put 'helm-buffer-run-ediff 'helm-only t)
-
-(defun helm-buffer-run-ediff-merge ()
- "Run ediff action from `helm-source-buffers-list'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ediff-marked-buffers-merge)))
-(put 'helm-buffer-run-ediff-merge 'helm-only t)
-
-(defun helm-buffers-persistent-kill-1 (buffer)
- "Persistent action to kill buffer."
- (if (eql (get-buffer buffer) (get-buffer helm-current-buffer))
- (progn
- (message "Can't kill `helm-current-buffer' without quitting session")
- (sit-for 1))
- (with-current-buffer (get-buffer buffer)
- (kill-buffer buffer))
- (helm-delete-current-selection)
- (with-helm-temp-hook 'helm-after-persistent-action-hook
- (helm-force-update (regexp-quote (helm-get-selection nil t))))))
-
-(defun helm-buffers--quote-truncated-buffer (buffer)
- (let ((bufname (and (bufferp buffer)
- (buffer-name buffer))))
- (when bufname
- (regexp-quote
- (if helm-buffer-max-length
- (helm-substring-by-width
- bufname helm-buffer-max-length
- "")
- bufname)))))
-
-(defun helm-buffers-persistent-kill (_buffer)
- (let ((marked (helm-marked-candidates)))
- (unwind-protect
- (cl-loop for b in marked
- do (progn (helm-preselect
- (format "^%s"
- (helm-buffers--quote-truncated-buffer b)))
- (when (y-or-n-p (format "kill buffer (%s)? " b))
- (helm-buffers-persistent-kill-1 b))
- (message nil)))
- (with-helm-buffer
- (setq helm-marked-candidates nil
- helm-visible-mark-overlays nil))
- (helm-force-update (helm-buffers--quote-truncated-buffer
- (helm-get-selection))))))
-
-(defun helm-buffers-list-persistent-action (candidate)
- (let ((current (window-buffer helm-persistent-action-display-window)))
- (if (or (eql current (get-buffer helm-current-buffer))
- (not (eql current (get-buffer candidate))))
- (switch-to-buffer candidate)
- (switch-to-buffer helm-current-buffer))))
-
-(defun helm-ediff-marked-buffers (_candidate &optional merge)
- "Ediff 2 marked buffers or CANDIDATE and `helm-current-buffer'.
-With optional arg MERGE call `ediff-merge-buffers'."
- (let ((lg-lst (length (helm-marked-candidates)))
- buf1 buf2)
- (cl-case lg-lst
- (0
- (error "Error:You have to mark at least 1 buffer"))
- (1
- (setq buf1 helm-current-buffer
- buf2 (cl-first (helm-marked-candidates))))
- (2
- (setq buf1 (cl-first (helm-marked-candidates))
- buf2 (cl-second (helm-marked-candidates))))
- (t
- (error "Error:To much buffers marked!")))
- (if merge
- (ediff-merge-buffers buf1 buf2)
- (ediff-buffers buf1 buf2))))
-
-(defun helm-ediff-marked-buffers-merge (candidate)
- "Ediff merge `helm-current-buffer' with CANDIDATE.
-See `helm-ediff-marked-buffers'."
- (helm-ediff-marked-buffers candidate t))
-
-(defun helm-multi-occur-as-action (_candidate)
- "Multi occur action for `helm-source-buffers-list'.
-Can be used by any source that list buffers."
- (let ((helm-moccur-always-search-in-current
- (if helm-current-prefix-arg
- (not helm-moccur-always-search-in-current)
- helm-moccur-always-search-in-current))
- (buffers (helm-marked-candidates))
- (input (cl-loop for i in (split-string helm-pattern " " t)
- thereis (and (string-match "\\`@\\(.*\\)" i)
- (match-string 1 i)))))
- (helm-multi-occur-1 buffers input)))
-
-(defun helm-buffers-run-multi-occur ()
- "Run `helm-multi-occur-as-action' by key."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-multi-occur-as-action)))
-(put 'helm-buffers-run-multi-occur 'helm-only t)
-
-(defun helm-buffers-toggle-show-hidden-buffers ()
- (interactive)
- (with-helm-alive-p
- (let ((filter-attrs (helm-attr 'filtered-candidate-transformer
- helm-source-buffers-list)))
- (if (memq 'helm-shadow-boring-buffers filter-attrs)
- (helm-attrset 'filtered-candidate-transformer
- (cons 'helm-skip-boring-buffers
- (remove 'helm-shadow-boring-buffers
- filter-attrs))
- helm-source-buffers-list t)
- (helm-attrset 'filtered-candidate-transformer
- (cons 'helm-shadow-boring-buffers
- (remove 'helm-skip-boring-buffers
- filter-attrs))
- helm-source-buffers-list t))
- (helm-force-update))))
-(put 'helm-buffers-toggle-show-hidden-buffers 'helm-only t)
-
-\f
-;;; Candidate Transformers
-;;
-;;
-(defun helm-skip-boring-buffers (buffers _source)
- (helm-skip-entries buffers
- helm-boring-buffer-regexp-list
- helm-white-buffer-regexp-list))
-
-(defun helm-shadow-boring-buffers (buffers _source)
- "Buffers matching `helm-boring-buffer-regexp' will be
-displayed with the `file-name-shadow' face if available."
- (helm-shadow-entries buffers helm-boring-buffer-regexp-list))
-
-\f
-;;;###autoload
-(defun helm-buffers-list ()
- "Preconfigured `helm' to list buffers."
- (interactive)
- (unless helm-source-buffers-list
- (setq helm-source-buffers-list
- (helm-make-source "Buffers" 'helm-source-buffers)))
- (helm :sources '(helm-source-buffers-list
- helm-source-ido-virtual-buffers
- helm-source-buffer-not-found)
- :buffer "*helm buffers*"
- :keymap helm-buffer-map
- :truncate-lines helm-buffers-truncate-lines))
-
-;;;###autoload
-(defun helm-mini ()
- "Preconfigured `helm' lightweight version \(buffer -> recentf\)."
- (interactive)
- (require 'helm-files)
- (unless helm-source-buffers-list
- (setq helm-source-buffers-list
- (helm-make-source "Buffers" 'helm-source-buffers)))
- (helm :sources helm-mini-default-sources
- :buffer "*helm mini*"
- :ff-transformer-show-only-basename nil
- :truncate-lines helm-buffers-truncate-lines))
-
-(provide 'helm-buffers)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-buffers.el ends here
+++ /dev/null
-;;; helm-color.el --- colors and faces -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-
-;;; Customize Face
-;;
-;;
-(defun helm-custom-faces-init ()
- "Initialize buffer for `helm-source-customize-face'."
- (unless (helm-candidate-buffer)
- (save-selected-window
- (list-faces-display)
- (message nil))
- (helm-init-candidates-in-buffer
- 'global
- (with-current-buffer (get-buffer "*Faces*")
- (buffer-substring
- (next-single-char-property-change (point-min) 'face)
- (point-max))))
- (kill-buffer "*Faces*")))
-
-(defvar helm-source-customize-face
- (helm-build-in-buffer-source "Customize Face"
- :init 'helm-custom-faces-init
- :get-line 'buffer-substring
- :action '(("Customize"
- . (lambda (line)
- (customize-face (intern (car (split-string line))))))
- ("Copy name"
- . (lambda (line)
- (kill-new (car (split-string line " " t)))))))
- "See (info \"(emacs)Faces\")")
-
-;;; Colors browser
-;;
-;;
-(defun helm-colors-init ()
- (unless (helm-candidate-buffer)
- (save-selected-window
- (list-colors-display)
- (message nil))
- (helm-init-candidates-in-buffer
- 'global
- (with-current-buffer (get-buffer "*Colors*")
- (buffer-string)))
- (kill-buffer "*Colors*")))
-
-(defun helm-color-insert-name (candidate)
- (with-helm-current-buffer
- (insert (helm-colors-get-name candidate))))
-
-(defun helm-color-kill-name (candidate)
- (kill-new (helm-colors-get-name candidate)))
-
-(defun helm-color-insert-rgb (candidate)
- (with-helm-current-buffer
- (insert (helm-colors-get-rgb candidate))))
-
-(defun helm-color-kill-rgb (candidate)
- (kill-new (helm-colors-get-rgb candidate)))
-
-(defun helm-color-run-insert-name ()
- "Insert name of color from `helm-source-colors'"
- (interactive)
- (with-helm-alive-p (helm-exit-and-execute-action 'helm-color-insert-name)))
-(put 'helm-color-run-insert-name 'helm-only t)
-
-(defun helm-color-run-kill-name ()
- "Kill name of color from `helm-source-colors'"
- (interactive)
- (with-helm-alive-p (helm-exit-and-execute-action 'helm-color-kill-name)))
-(put 'helm-color-run-kill-name 'helm-only t)
-
-(defun helm-color-run-insert-rgb ()
- "Insert RGB of color from `helm-source-colors'"
- (interactive)
- (with-helm-alive-p (helm-exit-and-execute-action 'helm-color-insert-rgb)))
-(put 'helm-color-run-insert-rgb 'helm-only t)
-
-(defun helm-color-run-kill-rgb ()
- "Kill RGB of color from `helm-source-colors'"
- (interactive)
- (with-helm-alive-p (helm-exit-and-execute-action 'helm-color-kill-rgb)))
-(put 'helm-color-run-kill-rgb 'helm-only t)
-
-(defvar helm-color-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-c n") 'helm-color-run-insert-name)
- (define-key map (kbd "C-c N") 'helm-color-run-kill-name)
- (define-key map (kbd "C-c r") 'helm-color-run-insert-rgb)
- (define-key map (kbd "C-c R") 'helm-color-run-kill-rgb)
- map))
-
-(defvar helm-source-colors
- (helm-build-in-buffer-source "Colors"
- :init 'helm-colors-init
- :get-line 'buffer-substring
- :keymap helm-color-map
- :persistent-help "Kill entry in RGB format."
- :persistent-action 'helm-color-kill-rgb
- :help-message 'helm-colors-help-message
- :action
- '(("Copy Name (C-c N)" . helm-color-kill-name)
- ("Copy RGB (C-c R)" . helm-color-kill-rgb)
- ("Insert Name (C-c n)" . helm-color-insert-name)
- ("Insert RGB (C-c r)" . helm-color-insert-rgb))))
-
-(defun helm-colors-get-name (candidate)
- "Get color name."
- (replace-regexp-in-string
- " " ""
- (with-temp-buffer
- (insert (capitalize candidate))
- (goto-char (point-min))
- (search-forward-regexp "\\s-\\{2,\\}")
- (delete-region (point) (point-max))
- (buffer-string))))
-
-(defun helm-colors-get-rgb (candidate)
- "Get color RGB."
- (replace-regexp-in-string
- " " ""
- (with-temp-buffer
- (insert (capitalize candidate))
- (goto-char (point-max))
- (search-backward-regexp "\\s-\\{2,\\}")
- (delete-region (point) (point-min))
- (buffer-string))))
-
-;;;###autoload
-(defun helm-colors ()
- "Preconfigured `helm' for color."
- (interactive)
- (helm :sources '(helm-source-colors helm-source-customize-face)
- :buffer "*helm colors*"))
-
-(provide 'helm-color)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-color.el ends here
+++ /dev/null
-;;; helm-command.el --- Helm execute-exended-command. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-mode)
-(require 'helm-elisp)
-
-\f
-(defgroup helm-command nil
- "Emacs command related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-M-x-requires-pattern 0
- "Value of requires-pattern for `helm-M-x'.
-Show all candidates on startup when 0 (default)."
- :group 'helm-command
- :type 'boolean)
-
-(defcustom helm-M-x-always-save-history nil
- "`helm-M-x' Save command in `extended-command-history' even when it fail."
- :group 'helm-command
- :type 'boolean)
-
-(defcustom helm-M-x-reverse-history nil
- "The history source of `helm-M-x' appear in second position when non--nil."
- :group 'helm-command
- :type 'boolean)
-
-(defcustom helm-M-x-fuzzy-match nil
- "Enable fuzzy matching in `helm-M-x' when non--nil.")
-
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-command-faces nil
- "Customize the appearance of helm-command."
- :prefix "helm-"
- :group 'helm-command
- :group 'helm-faces)
-
-(defface helm-M-x-key '((t (:foreground "orange" :underline t)))
- "Face used in helm-M-x to show keybinding."
- :group 'helm-command-faces)
-
-\f
-(defvar helm-M-x-input-history nil)
-
-\f
-(cl-defun helm-M-x-get-major-mode-command-alist (mode-map)
- "Return alist of MODE-MAP."
- (when mode-map
- (cl-loop for key being the key-seqs of mode-map using (key-bindings com)
- for str-key = (key-description key)
- for ismenu = (string-match "<menu-bar>" str-key)
- unless ismenu collect (cons str-key com))))
-
-(defun helm-get-mode-map-from-mode (mode)
- "Guess the mode-map name according to MODE.
-Some modes don't use conventional mode-map name
-so we need to guess mode-map name. e.g python-mode ==> py-mode-map.
-Return nil if no mode-map found."
- (cl-loop ;; Start with a conventional mode-map name.
- with mode-map = (intern-soft (format "%s-map" mode))
- with mode-string = (symbol-name mode)
- with mode-name = (replace-regexp-in-string "-mode" "" mode-string)
- while (not mode-map)
- for count downfrom (length mode-name)
- ;; Return when no result after parsing entire string.
- when (eq count 0) return nil
- for sub-name = (substring mode-name 0 count)
- do (setq mode-map (intern-soft (format "%s-map" (concat sub-name "-mode"))))
- finally return mode-map))
-
-(defun helm-M-x-current-mode-map-alist ()
- "Return mode-map alist of current `major-mode'."
- (let ((map-sym (helm-get-mode-map-from-mode major-mode)))
- (when (and map-sym (boundp map-sym))
- (helm-M-x-get-major-mode-command-alist (symbol-value map-sym)))))
-
-
-(defun helm-M-x-transformer-1 (candidates &optional sort)
- "Transformer function to show bindings in emacs commands.
-Show global bindings and local bindings according to current `major-mode'.
-If SORT is non nil sort list with `helm-generic-sort-fn'.
-Note that SORT should not be used when fuzzy matching because
-fuzzy matching is running its own sort function with a different algorithm."
- (with-helm-current-buffer
- (cl-loop with local-map = (helm-M-x-current-mode-map-alist)
- for cand in candidates
- for local-key = (car (rassq cand local-map))
- for key = (substitute-command-keys (format "\\[%s]" cand))
- unless (get (intern (if (consp cand) (car cand) cand)) 'helm-only)
- collect
- (cons (cond ((and (string-match "^M-x" key) local-key)
- (format "%s (%s)"
- cand (propertize
- local-key
- 'face 'helm-M-x-key)))
- ((string-match "^M-x" key) cand)
- (t (format "%s (%s)"
- cand (propertize
- key
- 'face 'helm-M-x-key))))
- cand)
- into ls
- finally return
- (if sort (sort ls #'helm-generic-sort-fn) ls))))
-
-(defun helm-M-x-transformer (candidates _source)
- "Transformer function for `helm-M-x' candidates."
- (helm-M-x-transformer-1 candidates (null helm--in-fuzzy)))
-
-(defun helm-M-x-transformer-hist (candidates _source)
- "Transformer function for `helm-M-x' candidates."
- (helm-M-x-transformer-1 candidates))
-
-(defun helm-M-x--notify-prefix-arg ()
- ;; Notify a prefix-arg set AFTER calling M-x.
- (when prefix-arg
- (with-helm-window
- (helm-display-mode-line (helm-get-current-source) 'force))))
-
-(defun helm-cmd--get-current-function-name ()
- (save-excursion
- (beginning-of-defun)
- (cadr (split-string (buffer-substring-no-properties
- (point-at-bol) (point-at-eol))))))
-
-(defun helm-cmd--get-preconfigured-commands (&optional dir)
- (let* ((helm-dir (or dir (helm-basedir (locate-library "helm"))))
- (helm-autoload-file (expand-file-name "helm-autoloads.el" helm-dir))
- results)
- (when (file-exists-p helm-autoload-file)
- (with-temp-buffer
- (insert-file-contents helm-autoload-file)
- (while (re-search-forward "Preconfigured" nil t)
- (push (substring (helm-cmd--get-current-function-name) 1) results))))
- results))
-
-(defun helm-M-x-read-extended-command (&optional collection history)
- "Read command name to invoke in `helm-M-x'.
-Helm completion is not provided when executing or defining
-kbd macros.
-Optional arg COLLECTION is to allow using another COLLECTION
-than the default which is OBARRAY."
- (if (or defining-kbd-macro executing-kbd-macro)
- (if helm-mode
- (unwind-protect
- (progn
- (helm-mode -1)
- (read-extended-command))
- (helm-mode 1))
- (read-extended-command))
- (let* ((orig-fuzzy-sort-fn helm-fuzzy-sort-fn)
- (helm-fuzzy-sort-fn (lambda (candidates source)
- (funcall orig-fuzzy-sort-fn
- candidates source 'real)))
- (helm--mode-line-display-prefarg t)
- (tm (run-at-time 1 0.1 'helm-M-x--notify-prefix-arg))
- (helm-move-selection-after-hook
- (cons (lambda () (setq current-prefix-arg nil))
- helm-move-selection-after-hook)))
- (setq extended-command-history
- (cl-loop for c in extended-command-history
- when (and c (commandp (intern c)))
- do (set-text-properties 0 (length c) nil c)
- and collect c))
- (unwind-protect
- (let ((msg "Error: Specifying a prefix arg before calling `helm-M-x'"))
- (when current-prefix-arg
- (ding)
- (message "%s" msg)
- (while (not (sit-for 1))
- (discard-input))
- (user-error msg))
- (setq current-prefix-arg nil)
- (helm-comp-read
- "M-x " (or collection obarray)
- :test 'commandp
- :requires-pattern helm-M-x-requires-pattern
- :name "Emacs Commands"
- :buffer "*helm M-x*"
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe this command"
- :history (or history extended-command-history)
- :reverse-history helm-M-x-reverse-history
- :input-history 'helm-M-x-input-history
- :del-input nil
- :help-message 'helm-M-x-help-message
- :must-match t
- :fuzzy helm-M-x-fuzzy-match
- :nomark t
- :candidates-in-buffer t
- :fc-transformer 'helm-M-x-transformer
- :hist-fc-transformer 'helm-M-x-transformer-hist))
- (cancel-timer tm)
- (setq helm--mode-line-display-prefarg nil)))))
-
-;;;###autoload
-(defun helm-M-x (arg &optional command-name)
- "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, are passed AFTER starting `helm-M-x'.
-
-You can get help on each command by persistent action."
- (interactive (list current-prefix-arg (helm-M-x-read-extended-command)))
- (let ((sym-com (and (stringp command-name) (intern-soft command-name))))
- ;; Avoid having `this-command' set to *exit-minibuffer.
- (setq this-command sym-com
- ;; Handle C-x z (repeat) Issue #322
- real-this-command sym-com)
- ;; If helm-M-x is called with regular emacs completion (kmacro)
- ;; use the value of arg otherwise use helm-current-prefix-arg.
- (let ((prefix-arg (or helm-current-prefix-arg arg)))
- ;; This ugly construct is to save history even on error.
- (unless helm-M-x-always-save-history
- (command-execute sym-com 'record))
- (setq extended-command-history
- (cons command-name
- (delete command-name extended-command-history)))
- (when helm-M-x-always-save-history
- (command-execute sym-com 'record)))))
-
-
-(provide 'helm-command)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-command.el ends here
+++ /dev/null
-;;; helm-config.el --- Applications library for `helm.el' -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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:
-
-\f
-;;; Require
-;;
-;;
-(declare-function async-bytecomp-package-mode "ext:async-bytecomp.el")
-(when (require 'async-bytecomp nil t)
- (and (fboundp 'async-bytecomp-package-mode)
- (async-bytecomp-package-mode 1)))
-
-\f
-(defgroup helm-config nil
- "Various configurations for Helm."
- :group 'helm)
-
-(defcustom helm-command-prefix-key "C-x c"
- "The key `helm-command-prefix' is bound to in the global map."
- :type '(choice (string :tag "Key") (const :tag "no binding"))
- :group 'helm-config
- :set
- (lambda (var key)
- (when (and (boundp var) (symbol-value var))
- (define-key (current-global-map)
- (read-kbd-macro (symbol-value var)) nil))
- (when key
- (define-key (current-global-map)
- (read-kbd-macro key) 'helm-command-prefix))
- (set var key)))
-
-(defcustom helm-minibuffer-history-key "C-r"
- "The key `helm-minibuffer-history' is bound to in minibuffer local maps."
- :type '(choice (string :tag "Key") (const :tag "no binding"))
- :group 'helm-config
- :set
- (lambda (var key)
- (cl-dolist (map '(minibuffer-local-completion-map
- minibuffer-local-filename-completion-map
- minibuffer-local-filename-must-match-map ; Emacs 23.1.+
- minibuffer-local-isearch-map
- minibuffer-local-map
- minibuffer-local-must-match-filename-map ; Older Emacsen
- minibuffer-local-must-match-map
- minibuffer-local-ns-map))
- (when (and (boundp map) (keymapp (symbol-value map)))
- (when (and (boundp var) (symbol-value var))
- (define-key (symbol-value map)
- (read-kbd-macro (symbol-value var)) nil))
- (when key
- (define-key (symbol-value map)
- (read-kbd-macro key) 'helm-minibuffer-history))))
- (set var key)))
-\f
-;;; Command Keymap
-;;
-;;
-(defvar helm-command-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "a") 'helm-apropos)
- (define-key map (kbd "e") 'helm-etags-select)
- (define-key map (kbd "l") 'helm-locate)
- (define-key map (kbd "s") 'helm-surfraw)
- (define-key map (kbd "r") 'helm-regexp)
- (define-key map (kbd "m") 'helm-man-woman)
- (define-key map (kbd "t") 'helm-top)
- (define-key map (kbd "/") 'helm-find)
- (define-key map (kbd "i") 'helm-semantic-or-imenu)
- (define-key map (kbd "I") 'helm-imenu-in-all-buffers)
- (define-key map (kbd "<tab>") 'helm-lisp-completion-at-point)
- (define-key map (kbd "p") 'helm-list-emacs-process)
- (define-key map (kbd "C-x r b") 'helm-filtered-bookmarks)
- (define-key map (kbd "M-y") 'helm-show-kill-ring)
- (define-key map (kbd "C-c <SPC>") 'helm-all-mark-rings)
- (define-key map (kbd "C-x C-f") 'helm-find-files)
- (define-key map (kbd "f") 'helm-multi-files)
- (define-key map (kbd "C-:") 'helm-eval-expression-with-eldoc)
- (define-key map (kbd "C-,") 'helm-calcul-expression)
- (define-key map (kbd "M-x") 'helm-M-x)
- (define-key map (kbd "M-s o") 'helm-occur)
- (define-key map (kbd "M-g a") 'helm-do-grep-ag)
- (define-key map (kbd "c") 'helm-colors)
- (define-key map (kbd "F") 'helm-select-xfont)
- (define-key map (kbd "8") 'helm-ucs)
- (define-key map (kbd "C-c f") 'helm-recentf)
- (define-key map (kbd "C-c g") 'helm-google-suggest)
- (define-key map (kbd "h i") 'helm-info-at-point)
- (define-key map (kbd "h r") 'helm-info-emacs)
- (define-key map (kbd "h g") 'helm-info-gnus)
- (define-key map (kbd "h h") 'helm-documentation)
- (define-key map (kbd "C-x C-b") 'helm-buffers-list)
- (define-key map (kbd "C-x r i") 'helm-register)
- (define-key map (kbd "C-c C-x") 'helm-run-external-command)
- (define-key map (kbd "b") 'helm-resume)
- (define-key map (kbd "M-g i") 'helm-gid)
- (define-key map (kbd "@") 'helm-list-elisp-packages)
- map))
-
-;; Don't override the keymap we just defined with an empty
-;; keymap. This also protect bindings changed by the user.
-(defvar helm-command-prefix)
-(define-prefix-command 'helm-command-prefix)
-(fset 'helm-command-prefix helm-command-map)
-(setq helm-command-prefix helm-command-map)
-
-\f
-;;; Menu
-
-(require 'helm-easymenu)
-
-\f
-;;;###autoload
-(defun helm-configuration ()
- "Customize `helm'."
- (interactive)
- (customize-group "helm"))
-
-\f
-;;; Fontlock
-(cl-dolist (mode '(emacs-lisp-mode lisp-interaction-mode))
- (font-lock-add-keywords
- mode
- '(("(\\<\\(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)
- ("(\\<\\(with-helm-default-directory\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(with-helm-display-same-window\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(with-helm-restore-variables\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(define-helm-type-attribute\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(helm-multi-key-defun\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(helm-while-no-input\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(helm-aif\\)\\>" 1 font-lock-keyword-face))))
-
-\f
-;;; Load the autoload file
-;; It should have been generated either by
-;; package.el or the make file.
-
-(load "helm-autoloads" nil t)
-
-(provide 'helm-config)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-config.el ends here
+++ /dev/null
-;;; helm-dabbrev.el --- Helm implementation of dabbrev. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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)
-(require 'helm-help)
-(require 'helm-elisp) ; For show-completion.
-\f
-(defgroup helm-dabbrev nil
- "Dabbrev related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-dabbrev-always-search-all 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'."
- :group 'helm-dabbrev
- :type 'boolean)
-
-(defcustom helm-dabbrev-max-length-result 20
- "Max length of candidates before searching in all buffers.
-If number of candidates found in current-buffer is <= to this,
-search in all buffers.
-Have no effect when `helm-dabbrev-always-search-all' is non--nil."
- :group 'helm-dabbrev
- :type 'integer)
-
-(defcustom helm-dabbrev-ignored-buffers-regexps
- '("\\*helm" "\\*Messages" "\\*Echo Area" "\\*Buffer List")
- "List of regexps matching names of buffers that helm-dabbrev should not check."
- :group 'helm-dabbrev
- :type '(repeat regexp))
-
-(defcustom helm-dabbrev-related-buffer-fn #'helm-dabbrev--same-major-mode-p
- "A function that decide if a buffer to search in is 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 example.
-
-When nil all buffers are considered related to `current-buffer'."
- :group 'helm-dabbrev
- :type 'function)
-
-(defcustom helm-dabbrev-major-mode-assoc
- '((emacs-lisp-mode . lisp-interaction-mode))
- "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 have same `major-mode'
-than the `current-buffer'.
-This have no effect when `helm-dabbrev-related-buffer-fn' is nil or of course
-bound to a function that doesn't handle this var."
- :type '(alist :key-type symbol :value-type symbol)
- :group 'helm-dabbrev)
-
-(defcustom helm-dabbrev-lineno-around 30
- "Search first in this number of lines before an after point."
- :group 'helm-dabbrev
- :type 'integer)
-
-(defcustom helm-dabbrev-cycle-threshold nil
- "Number of time helm-dabbrev cycle before displaying helm completion.
-When nil or 0 disable cycling."
- :group 'helm-dabbrev
- :type '(choice (const :tag "Cycling disabled" nil) integer))
-
-(defcustom helm-dabbrev-case-fold-search '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)."
- :group 'helm-dabbrev
- :type '(choice (const :tag "Ignore case" t)
- (const :tag "Respect case" nil)
- (other :tag "Smart" 'smart)))
-
-\f
-(defvar helm-dabbrev-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-/") 'helm-next-line)
- (define-key map (kbd "M-:") 'helm-previous-line)
- map))
-
-;; Internal
-(defvar helm-dabbrev--exclude-current-buffer-flag nil)
-(defvar helm-dabbrev--cache nil)
-(defvar helm-dabbrev--data nil)
-(defvar helm-dabbrev--regexp "\\s-\\|\t\\|[(\[\{\"'`=<$;.]\\|\\s\\\\|^")
-(cl-defstruct helm-dabbrev-info dabbrev limits iterator)
-
-\f
-(defun helm-dabbrev--buffer-list ()
- (cl-loop with lst = (buffer-list)
- for buf in (if helm-dabbrev--exclude-current-buffer-flag
- (cdr lst) lst)
- unless (cl-loop for r in helm-dabbrev-ignored-buffers-regexps
- thereis (string-match r (buffer-name buf)))
- collect buf))
-
-(defun helm-dabbrev--same-major-mode-p (start-buffer)
- ;; START-BUFFER is the current-buffer where we start searching.
- ;; Determine the major-mode of START-BUFFER as `cur-maj-mode'.
- ;; Each time the loop go in another buffer we try to find if its
- ;; `major-mode' is:
- ;; - same as the `cur-maj-mode'
- ;; - derived from `cur-maj-mode'
- ;; - have an assoc entry (major-mode . cur-maj-mode)
- ;; - have an rassoc entry (cur-maj-mode . major-mode)
- ;; - check if one of these entries inherit from another one in
- ;; `helm-dabbrev-major-mode-assoc'.
- (let* ((cur-maj-mode (with-current-buffer start-buffer major-mode))
- (c-assoc-mode (assq cur-maj-mode helm-dabbrev-major-mode-assoc))
- (c-rassoc-mode (rassq cur-maj-mode helm-dabbrev-major-mode-assoc))
- (o-assoc-mode (assq major-mode helm-dabbrev-major-mode-assoc))
- (o-rassoc-mode (rassq major-mode helm-dabbrev-major-mode-assoc))
- (cdr-c-assoc-mode (cdr c-assoc-mode))
- (cdr-o-assoc-mode (cdr o-assoc-mode)))
- (or (eq major-mode cur-maj-mode)
- (derived-mode-p cur-maj-mode)
- (or (eq cdr-c-assoc-mode major-mode)
- (eq (car c-rassoc-mode) major-mode)
- (eq (cdr (assq cdr-c-assoc-mode helm-dabbrev-major-mode-assoc))
- major-mode)
- (eq (car (rassq cdr-c-assoc-mode helm-dabbrev-major-mode-assoc))
- major-mode))
- (or (eq cdr-o-assoc-mode cur-maj-mode)
- (eq (car o-rassoc-mode) cur-maj-mode)
- (eq (cdr (assq cdr-o-assoc-mode helm-dabbrev-major-mode-assoc))
- cur-maj-mode)
- (eq (car (rassq cdr-o-assoc-mode helm-dabbrev-major-mode-assoc))
- cur-maj-mode)))))
-
-(defun helm-dabbrev--collect (str limit ignore-case all)
- (let* ((case-fold-search ignore-case)
- (buffer1 (current-buffer)) ; start buffer.
- (minibuf (minibufferp buffer1))
- result pos-before pos-after
- (search-and-store
- (lambda (pattern direction)
- (while (cl-case direction
- (1 (search-forward pattern nil t))
- (-1 (search-backward pattern nil t))
- (2 (let ((pos
- (save-excursion
- (forward-line
- helm-dabbrev-lineno-around)
- (point))))
- (setq pos-after pos)
- (search-forward pattern pos t)))
- (-2 (let ((pos
- (save-excursion
- (forward-line
- (- helm-dabbrev-lineno-around))
- (point))))
- (setq pos-before pos)
- (search-backward pattern pos t))))
- (let* ((replace-regexp (concat "\\(" helm-dabbrev--regexp "\\)\\'"))
- (match-1 (helm-aif (thing-at-point 'symbol)
- ;; `thing-at-point' returns
- ;; the quote outside of e-lisp mode,
- ;; e.g in message mode,
- ;; `foo' => foo'
- ;; but in e-lisp like modes:
- ;; `foo' => foo
- ;; so remove it [1].
- (replace-regexp-in-string
- replace-regexp
- "" (substring-no-properties it))))
- (match-2 (helm-aif (thing-at-point 'filename)
- ;; Same as in [1].
- (replace-regexp-in-string
- replace-regexp
- "" (substring-no-properties it))))
- (lst (if (string= match-1 match-2)
- (list match-1)
- (list match-1 match-2))))
- (cl-loop for match in lst
- unless (or (string= str match)
- (member match result))
- do (push match result)))))))
- (cl-loop for buf in (if all (helm-dabbrev--buffer-list)
- (list (current-buffer)))
-
- do (with-current-buffer buf
- (when (or minibuf ; check against all buffers when in minibuffer.
- (if helm-dabbrev-related-buffer-fn
- (funcall helm-dabbrev-related-buffer-fn buffer1)
- t))
- (save-excursion
- ;; Start searching before thing before point.
- (goto-char (- (point) (length str)))
- ;; Search the last 30 lines before point.
- (funcall search-and-store str -2)) ; store pos [1]
- (save-excursion
- ;; Search the next 30 lines after point.
- (funcall search-and-store str 2)) ; store pos [2]
- (save-excursion
- ;; Search all before point.
- (goto-char pos-before) ; start from [1]
- (funcall search-and-store str -1))
- (save-excursion
- ;; Search all after point.
- (goto-char pos-after) ; start from [2]
- (funcall search-and-store str 1))))
- when (> (length result) limit) return (nreverse result)
- finally return (nreverse result))))
-
-(defun helm-dabbrev--get-candidates (abbrev)
- (cl-assert abbrev nil "[No Match]")
- (with-current-buffer (current-buffer)
- (let* ((dabbrev-get (lambda (str all-bufs)
- (helm-dabbrev--collect
- str helm-candidate-number-limit
- (cl-case helm-dabbrev-case-fold-search
- (smart (helm-set-case-fold-search-1 abbrev))
- (t helm-dabbrev-case-fold-search))
- all-bufs)))
- (lst (funcall dabbrev-get abbrev helm-dabbrev-always-search-all)))
- (if (and (not helm-dabbrev-always-search-all)
- (<= (length lst) helm-dabbrev-max-length-result))
- ;; Search all but don't recompute current-buffer.
- (let ((helm-dabbrev--exclude-current-buffer-flag t))
- (append lst (funcall dabbrev-get abbrev 'all-bufs)))
- lst))))
-\f
-(defun helm-dabbrev-default-action (candidate)
- (with-helm-current-buffer
- (let* ((limits (helm-bounds-of-thing-before-point
- helm-dabbrev--regexp))
- (beg (car limits))
- (end (point)))
- (run-with-timer
- 0.01 nil
- 'helm-insert-completion-at-point
- beg end candidate))))
-
-;;;###autoload
-(defun helm-dabbrev ()
- "Preconfigured helm for dynamic abbreviations."
- (interactive)
- (let ((dabbrev (helm-thing-before-point nil helm-dabbrev--regexp))
- (limits (helm-bounds-of-thing-before-point helm-dabbrev--regexp))
- (enable-recursive-minibuffers t)
- (cycling-disabled-p (or (null helm-dabbrev-cycle-threshold)
- (zerop helm-dabbrev-cycle-threshold)))
- (helm-execute-action-at-once-if-one t)
- (helm-quit-if-no-candidate
- (lambda ()
- (message "[Helm-dabbrev: No expansion found]"))))
- (cl-assert (and (stringp dabbrev) (not (string= dabbrev "")))
- nil "[Helm-dabbrev: Nothing found before point]")
- (when (and
- ;; have been called at least once.
- (helm-dabbrev-info-p helm-dabbrev--data)
- ;; But user have moved with some other command
- ;; in the meaning time.
- (not (eq last-command 'helm-dabbrev)))
- (setq helm-dabbrev--data nil))
- (when cycling-disabled-p
- (setq helm-dabbrev--cache (helm-dabbrev--get-candidates dabbrev)))
- (unless (or cycling-disabled-p
- (helm-dabbrev-info-p helm-dabbrev--data))
- (setq helm-dabbrev--cache (helm-dabbrev--get-candidates dabbrev))
- (setq helm-dabbrev--data
- (make-helm-dabbrev-info
- :dabbrev dabbrev
- :limits limits
- :iterator
- (helm-iter-list
- (cl-loop for i in helm-dabbrev--cache when
- (and i (string-match
- (concat "^" (regexp-quote dabbrev)) i))
- collect i into selection
- when (and selection
- (= (length selection)
- helm-dabbrev-cycle-threshold))
- ;; When selection len reach
- ;; `helm-dabbrev-cycle-threshold'
- ;; return selection.
- return selection
- ;; selection len never reach
- ;; `helm-dabbrev-cycle-threshold'
- ;; return selection.
- finally return selection)))))
- (let ((iter (and (helm-dabbrev-info-p helm-dabbrev--data)
- (helm-dabbrev-info-iterator helm-dabbrev--data)))
- deactivate-mark)
- ;; Cycle until iterator is consumed.
- (helm-aif (and iter (helm-iter-next iter))
- (progn
- (helm-insert-completion-at-point
- (car (helm-dabbrev-info-limits helm-dabbrev--data))
- (cdr limits) it)
- ;; Move already tried candidates to end of list.
- (setq helm-dabbrev--cache (append (remove it helm-dabbrev--cache)
- (list it))))
- ;; If the length of candidates is only one when computed
- ;; that's mean the unique matched item have already been
- ;; inserted by the iterator, so no need to reinsert the old dabbrev,
- ;; just let helm exiting with "No expansion found".
- (let ((old-dabbrev (if (helm-dabbrev-info-p helm-dabbrev--data)
- (helm-dabbrev-info-dabbrev helm-dabbrev--data)
- dabbrev)))
- (unless (cdr (all-completions old-dabbrev helm-dabbrev--cache))
- (setq cycling-disabled-p t))
- ;; Iterator is now empty, reset dabbrev to initial value
- ;; and start helm completion.
- (unless cycling-disabled-p
- (setq dabbrev old-dabbrev
- limits (helm-dabbrev-info-limits helm-dabbrev--data))
- (setq helm-dabbrev--data nil)
- (delete-region (car limits) (point))
- (insert dabbrev))
- (with-helm-show-completion (car limits) (cdr limits)
- (helm :sources (helm-build-in-buffer-source "Dabbrev Expand"
- :data helm-dabbrev--cache
- :persistent-action 'ignore
- :persistent-help "DoNothing"
- :keymap helm-dabbrev-map
- :action 'helm-dabbrev-default-action)
- :buffer "*helm dabbrev*"
- :input (concat "^" dabbrev " ")
- :resume 'noresume
- :allow-nest t)))))))
-
-(provide 'helm-dabbrev)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-dabbrev.el ends here
+++ /dev/null
-;;; helm-easymenu.el --- Helm easymenu definitions. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'easymenu)
-
-(easy-menu-add-item
- nil '("Tools")
- '("Helm"
- ["Find any Files/Buffers" helm-multi-files t]
- ["Helm Everywhere (Toggle)" helm-mode t]
- ["Helm resume" helm-resume t]
- "----"
- ("Files"
- ["Find files" helm-find-files t]
- ["Recent Files" helm-recentf t]
- ["Locate" helm-locate t]
- ["Search Files with find" helm-find t]
- ["Bookmarks" helm-filtered-bookmarks t])
- ("Buffers"
- ["Find buffers" helm-buffers-list t])
- ("Commands"
- ["Emacs Commands" helm-M-x t]
- ["Externals Commands" helm-run-external-command t])
- ("Help"
- ["Helm Apropos" helm-apropos t])
- ("Info"
- ["Info at point" helm-info-at-point t]
- ["Emacs Manual index" helm-info-emacs t]
- ["Gnus Manual index" helm-info-gnus t]
- ["Helm documentation" helm-documentation t])
- ("Org"
- ["Org headlines in org agenda files" helm-org-agenda-files-headings t]
- ["Org headlines in buffer" helm-org-in-buffer-headings t])
- ("Elpa"
- ["Elisp packages" helm-list-elisp-packages t]
- ["Elisp packages no fetch" helm-list-elisp-packages-no-fetch t])
- ("Tools"
- ["Occur" helm-occur t]
- ["Grep current directory with AG" helm-do-grep-ag t]
- ["Gid" helm-gid t]
- ["Etags" helm-etags-select t]
- ["Lisp complete at point" helm-lisp-completion-at-point t]
- ["Browse Kill ring" helm-show-kill-ring t]
- ["Browse register" helm-register t]
- ["Mark Ring" helm-all-mark-rings t]
- ["Regexp handler" helm-regexp t]
- ["Colors & Faces" helm-colors t]
- ["Show xfonts" helm-select-xfont t]
- ["Ucs Symbols" helm-ucs t]
- ["Imenu" helm-imenu t]
- ["Imenu all" helm-imenu-in-all-buffers t]
- ["Semantic or Imenu" helm-semantic-or-imenu t]
- ["Google Suggest" helm-google-suggest t]
- ["Eval expression" helm-eval-expression-with-eldoc t]
- ["Calcul expression" helm-calcul-expression t]
- ["Man pages" helm-man-woman t]
- ["Top externals process" helm-top t]
- ["Emacs internals process" helm-list-emacs-process t])
- "----"
- ["Preferred Options" helm-configuration t])
- "Spell Checking")
-
-(easy-menu-add-item nil '("Tools") '("----") "Spell Checking")
-
-
-(provide 'helm-easymenu)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-easymenu.el ends here
+++ /dev/null
-;;; helm-elisp-package.el --- helm interface for package.el -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'package)
-
-(defgroup helm-el-package nil
- "helm elisp packages."
- :group 'helm)
-
-(defcustom helm-el-package-initial-filter 'all
- "Show only installed, upgraded or all packages at startup."
- :group 'helm-el-package
- :type '(radio :tag "Initial filter for elisp packages"
- (const :tag "Show all packages" all)
- (const :tag "Show installed packages" installed)
- (const :tag "Show not installed packages" uninstalled)
- (const :tag "Show upgradable packages" upgrade)))
-
-;; internals vars
-(defvar helm-el-package--show-only 'all)
-(defvar helm-el-package--initialized-p nil)
-(defvar helm-el-package--tabulated-list nil)
-(defvar helm-el-package--upgrades nil)
-(defvar helm-el-package--removable-packages nil)
-
-(defun helm-el-package--init ()
- (when (null package-alist)
- (setq helm-el-package--show-only 'all))
- (when (fboundp 'package--removable-packages)
- (setq helm-el-package--removable-packages
- (package--removable-packages)))
- (save-selected-window
- (list-packages helm-el-package--initialized-p)
- (setq helm-el-package--initialized-p t)
- (message nil))
- (helm-init-candidates-in-buffer
- 'global
- (with-current-buffer (get-buffer "*Packages*")
- (setq helm-el-package--tabulated-list tabulated-list-entries)
- (buffer-string)))
- (setq helm-el-package--upgrades (helm-el-package-menu--find-upgrades))
- (if helm-force-updating-p
- (if helm-el-package--upgrades
- (message "%d package(s) can be upgraded, Refreshing packages list done"
- (length helm-el-package--upgrades))
- (message "Refreshing packages list done, no upgrades available"))
- (setq helm-el-package--show-only (if helm-el-package--upgrades
- 'upgrade
- helm-el-package-initial-filter)))
- (kill-buffer "*Packages*"))
-
-(defun helm-el-package-describe (candidate)
- (let ((id (get-text-property 0 'tabulated-list-id candidate)))
- (describe-package (if (fboundp 'package-desc-name)
- (package-desc-name id)
- (car id)))))
-
-(defun helm-el-package-visit-homepage (candidate)
- (let* ((id (get-text-property 0 'tabulated-list-id candidate))
- (pkg (if (fboundp 'package-desc-name) (package-desc-name id)
- (car id)))
- (desc (cadr (assoc pkg package-archive-contents)))
- (extras (package-desc-extras desc))
- (url (and (listp extras) (cdr-safe (assoc :url extras)))))
- (if (stringp url)
- (browse-url url)
- (message "Package %s has no homepage"
- (propertize (symbol-name pkg)
- 'face 'font-lock-keyword-face)))))
-
-(defun helm-el-run-visit-homepage ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-visit-homepage)))
-(put 'helm-el-run-visit-homepage 'helm-only t)
-
-(defun helm-el-package-install-1 (pkg-list)
- (cl-loop with mkd = pkg-list
- for p in mkd
- for id = (get-text-property 0 'tabulated-list-id p)
- do (package-install
- (if (fboundp 'package-desc-name)
- (package-desc-name id)
- (car id)))
- collect (if (fboundp 'package-desc-full-name)
- id
- (car id))
- into installed-list
- finally do (progn
- (when (boundp 'package-selected-packages)
- (customize-save-variable
- 'package-selected-packages
- (append (mapcar 'package-desc-name installed-list)
- package-selected-packages)))
- (if (fboundp 'package-desc-full-name)
- (message (format "%d packages installed:\n(%s)"
- (length installed-list)
- (mapconcat #'package-desc-full-name
- installed-list ", ")))
- (message (format "%d packages installed:\n(%s)"
- (length installed-list)
- (mapconcat 'symbol-name installed-list ", ")))))))
-
-(defun helm-el-package-install (_candidate)
- (helm-el-package-install-1 (helm-marked-candidates)))
-
-(defun helm-el-run-package-install ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-install)))
-(put 'helm-el-run-package-install 'helm-only t)
-
-(defun helm-el-package-uninstall-1 (pkg-list)
- (cl-loop with mkd = pkg-list
- for p in mkd
- for id = (get-text-property 0 'tabulated-list-id p)
- do
- (condition-case-unless-debug err
- (with-no-warnings
- (if (fboundp 'package-desc-full-name)
- ;; emacs 24.4
- (package-delete id)
- ;; emacs 24.3
- (package-delete (symbol-name (car id))
- (package-version-join (cdr id)))))
- (error (message (cadr err))))
- unless (assoc (elt id 1) package-alist)
- collect (if (fboundp 'package-desc-full-name)
- id
- (cons (symbol-name (car id))
- (package-version-join (cdr id))))
- into delete-list
- finally do (if delete-list
- (if (fboundp 'package-desc-full-name)
- ;; emacs 24.4
- (message (format "%d packages deleted:\n(%s)"
- (length delete-list)
- (mapconcat #'package-desc-full-name
- delete-list ", ")))
- ;; emacs 24.3
- (message (format "%d packages deleted:\n(%s)"
- (length delete-list)
- (mapconcat (lambda (x)
- (concat (car x) "-" (cdr x)))
- delete-list ", ")))
- ;; emacs 24.3 doesn't update
- ;; its `package-alist' after deleting.
- (cl-loop for p in package-alist
- when (assq (symbol-name (car p)) delete-list)
- do (setq package-alist (delete p package-alist))))
- "No package deleted")))
-
-(defun helm-el-package-uninstall (_candidate)
- (helm-el-package-uninstall-1 (helm-marked-candidates)))
-
-(defun helm-el-run-package-uninstall ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-uninstall)))
-(put 'helm-el-run-package-uninstall 'helm-only t)
-
-(defun helm-el-package-menu--find-upgrades ()
- (cl-loop for entry in helm-el-package--tabulated-list
- for pkg-desc = (car entry)
- for status = (package-desc-status pkg-desc)
- when (member status '("installed" "unsigned" "dependency"))
- collect pkg-desc
- into installed
- when (member status '("available" "new"))
- collect (cons (package-desc-name pkg-desc) pkg-desc)
- into available
- finally return
- (cl-loop for pkg in installed
- for avail-pkg = (assq (package-desc-name pkg) available)
- when (and avail-pkg
- (version-list-< (package-desc-version pkg)
- (package-desc-version
- (cdr avail-pkg))))
- collect avail-pkg)))
-
-(defun helm-el-package-upgrade-1 (pkg-list)
- (cl-loop for p in pkg-list
- for pkg-desc = (car p)
- for upgrade = (cdr (assq (package-desc-name pkg-desc)
- helm-el-package--upgrades))
- do
- (cond ((null upgrade)
- (ignore))
- ((equal pkg-desc upgrade)
- ;;Install.
- (package-install pkg-desc))
- (t
- ;; Delete.
- (if (boundp 'package-selected-packages)
- (with-no-warnings
- (package-delete pkg-desc t t))
- (package-delete pkg-desc))))))
-
-(defun helm-el-package-upgrade (_candidate)
- (helm-el-package-upgrade-1
- (cl-loop with pkgs = (helm-marked-candidates)
- for p in helm-el-package--tabulated-list
- for pkg = (car p)
- if (member (symbol-name (package-desc-name pkg)) pkgs)
- collect p)))
-
-(defun helm-el-run-package-upgrade ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-upgrade)))
-(put 'helm-el-run-package-upgrade 'helm-only t)
-
-(defun helm-el-package-upgrade-all ()
- (if helm-el-package--upgrades
- (with-helm-display-marked-candidates
- helm-marked-buffer-name (mapcar (lambda (x) (symbol-name (car x)))
- helm-el-package--upgrades)
- (when (y-or-n-p "Upgrade all packages? ")
- (helm-el-package-upgrade-1 helm-el-package--tabulated-list)))
- (message "No packages to upgrade actually!")))
-
-(defun helm-el-package-upgrade-all-action (_candidate)
- (helm-el-package-upgrade-all))
-
-(defun helm-el-run-package-upgrade-all ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-upgrade-all-action)))
-(put 'helm-el-run-package-upgrade-all 'helm-only t)
-
-(defun helm-el-package--transformer (candidates _source)
- (cl-loop for c in candidates
- for id = (get-text-property 0 'tabulated-list-id c)
- for name = (if (fboundp 'package-desc-name)
- (package-desc-name id)
- (car id))
- for installed-p = (assq name package-alist)
- for upgrade-p = (assq name helm-el-package--upgrades)
- for user-installed-p = (and (boundp 'package-selected-packages)
- (memq name package-selected-packages))
- do (when user-installed-p (put-text-property 0 2 'display "S " c))
- do (when (memq name helm-el-package--removable-packages)
- (put-text-property 0 2 'display "U " c)
- (put-text-property
- 2 (+ (length (symbol-name name)) 2)
- 'face 'font-lock-variable-name-face c))
- for cand = (cons c (car (split-string c)))
- when (or (and upgrade-p
- (eq helm-el-package--show-only 'upgrade))
- (and installed-p
- (eq helm-el-package--show-only 'installed))
- (and (not installed-p)
- (eq helm-el-package--show-only 'uninstalled))
- (eq helm-el-package--show-only 'all))
- collect cand))
-
-(defun helm-el-package-show-upgrade ()
- (interactive)
- (with-helm-alive-p
- (setq helm-el-package--show-only 'upgrade)
- (helm-update)))
-(put 'helm-el-package-show-upgrade 'helm-only t)
-
-(defun helm-el-package-show-installed ()
- (interactive)
- (with-helm-alive-p
- (setq helm-el-package--show-only 'installed)
- (helm-update)))
-(put 'helm-el-package-show-installed 'helm-only t)
-
-(defun helm-el-package-show-all ()
- (interactive)
- (with-helm-alive-p
- (setq helm-el-package--show-only 'all)
- (helm-update)))
-(put 'helm-el-package-show-all 'helm-only t)
-
-(defun helm-el-package-show-uninstalled ()
- (interactive)
- (with-helm-alive-p
- (setq helm-el-package--show-only 'uninstalled)
- (helm-update)))
-(put 'helm-el-package-show-uninstalled 'helm-only t)
-
-(defvar helm-el-package-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-I") 'helm-el-package-show-installed)
- (define-key map (kbd "M-O") 'helm-el-package-show-uninstalled)
- (define-key map (kbd "M-U") 'helm-el-package-show-upgrade)
- (define-key map (kbd "M-A") 'helm-el-package-show-all)
- (define-key map (kbd "C-c i") 'helm-el-run-package-install)
- (define-key map (kbd "C-c r") 'helm-el-run-package-reinstall)
- (define-key map (kbd "C-c d") 'helm-el-run-package-uninstall)
- (define-key map (kbd "C-c u") 'helm-el-run-package-upgrade)
- (define-key map (kbd "C-c U") 'helm-el-run-package-upgrade-all)
- (define-key map (kbd "C-c @") 'helm-el-run-visit-homepage)
- map))
-
-(defvar helm-source-list-el-package nil)
-(defclass helm-list-el-package-source (helm-source-in-buffer)
- ((init :initform 'helm-el-package--init)
- (get-line :initform 'buffer-substring)
- (filtered-candidate-transformer :initform 'helm-el-package--transformer)
- (action-transformer
- :initform
- (lambda (actions candidate)
- (let ((pkg-desc (get-text-property
- 0 'tabulated-list-id candidate))
- (acts (if helm-el-package--upgrades
- (append actions '(("Upgrade all packages"
- . helm-el-package-upgrade-all-action)))
- actions)))
- (cond ((and (package-installed-p (package-desc-name pkg-desc))
- (cdr (assq (package-desc-name pkg-desc)
- helm-el-package--upgrades)))
- (append '(("Upgrade package(s)" . helm-el-package-upgrade)
- ("Uninstall package(s)" . helm-el-package-uninstall)) acts))
- ((cdr (assq (package-desc-name pkg-desc)
- helm-el-package--upgrades))
- (append '(("Upgrade package(s)" . helm-el-package-upgrade)) acts))
- ((package-installed-p (package-desc-name pkg-desc))
- (append acts '(("Reinstall package(s)" . helm-el-package-reinstall)
- ("Uninstall package(s)" . helm-el-package-uninstall))))
- (t (append acts '(("Install packages(s)" . helm-el-package-install))))))))
- (help-message :initform 'helm-el-package-help-message)
- (keymap :initform helm-el-package-map)
- (update :initform 'helm-el-package--update)
- (candidate-number-limit :initform 9999)
- (action :initform '(("Describe package" . helm-el-package-describe)
- ("Visit homepage" . helm-el-package-visit-homepage)))))
-
-(defun helm-el-package--update ()
- (setq helm-el-package--initialized-p nil))
-
-(defun helm-el-package-reinstall (_pkg)
- (cl-loop for p in (helm-marked-candidates)
- for pkg-desc = (get-text-property 0 'tabulated-list-id p)
- for name = (package-desc-name pkg-desc)
- do (if (fboundp 'package-reinstall)
- (package-reinstall name)
- (package-delete pkg-desc)
- (package-install name))))
-
-(defun helm-el-run-package-reinstall ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-el-package-reinstall)))
-(put 'helm-el-run-package-reinstall 'helm-only t)
-
-;;;###autoload
-(defun helm-list-elisp-packages (arg)
- "Preconfigured helm for listing and handling emacs packages."
- (interactive "P")
- (when arg (setq helm-el-package--initialized-p nil))
- (unless helm-source-list-el-package
- (setq helm-source-list-el-package
- (helm-make-source "list packages" 'helm-list-el-package-source)))
- (helm :sources 'helm-source-list-el-package
- :buffer "*helm list packages*"))
-
-;;;###autoload
-(defun helm-list-elisp-packages-no-fetch ()
- "Preconfigured helm for emacs packages.
-Same as `helm-list-elisp-packages' but don't fetch packages on remote."
- (interactive)
- (let ((helm-el-package--initialized-p t))
- (helm-list-elisp-packages nil)))
-
-(provide 'helm-elisp-package)
-
-;;; helm-elisp-package.el ends here
+++ /dev/null
-;;; helm-elisp.el --- Elisp symbols completion for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-types)
-(require 'helm-utils)
-(require 'helm-info)
-(require 'helm-eval)
-(require 'helm-files)
-(require 'advice)
-
-(declare-function 'helm-describe-function "helm-lib")
-(declare-function 'helm-describe-variable "helm-lib")
-(declare-function 'helm-describe-face "helm-lib")
-
-\f
-;;; Customizable values
-
-(defgroup helm-elisp nil
- "Elisp related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-turn-on-show-completion t
- "Display candidate in buffer while moving selection when non--nil."
- :group 'helm-elisp
- :type 'boolean)
-
-(defcustom helm-show-completion-use-special-display t
- "A special display will be used in Lisp completion if non--nil.
-All functions that are wrapped in macro `with-helm-show-completion'
-will be affected."
- :group 'helm-elisp
- :type 'boolean)
-
-(defcustom helm-show-completion-min-window-height 7
- "Minimum completion window height used in show completion.
-This is used in macro `with-helm-show-completion'."
- :group 'helm-elisp
- :type 'integer)
-
-(defcustom helm-lisp-quoted-function-list
- '(funcall apply mapc cl-mapc mapcar cl-mapcar
- callf callf2 cl-callf cl-callf2 fset
- fboundp fmakunbound symbol-function)
- "List of function where quoted function completion happen.
-e.g give only function names after \(funcall '."
- :group 'helm-elisp
- :type '(repeat (choice symbol)))
-
-(defcustom helm-lisp-unquoted-function-list
- '(function defadvice)
- "List of function where unquoted function completion happen.
-e.g give only function names after \(function ."
- :group 'helm-elisp
- :type '(repeat (choice symbol)))
-
-(defcustom helm-apropos-fuzzy-match nil
- "Enable fuzzy matching for `helm-apropos' when non-nil."
- :group 'helm-elisp
- :type 'boolean)
-
-(defcustom helm-lisp-fuzzy-completion nil
- "Enable fuzzy matching in emacs-lisp completion when non-nil.
-NOTE: This enable 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'."
- :group 'helm-elisp
- :type 'boolean)
-
-(defcustom helm-apropos-function-list '(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
- helm-def-source--helm-attributes)
- "A list of functions that build helm sources to use in `helm-apropos'."
- :group 'helm-elisp
- :type '(repeat (choice symbol)))
-
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-elisp-faces nil
- "Customize the appearance of helm-elisp."
- :prefix "helm-"
- :group 'helm-elisp
- :group 'helm-faces)
-
-(defface helm-lisp-show-completion
- '((t (:background "DarkSlateGray")))
- "Face used for showing candidates in `helm-lisp-completion'."
- :group 'helm-elisp-faces)
-
-(defface helm-lisp-completion-info
- '((t (:foreground "red")))
- "Face used for showing info in `helm-lisp-completion'."
- :group 'helm-elisp-faces)
-
-(defcustom helm-elisp-help-function
- 'helm-elisp-show-help
- "Function for displaying help for Lisp symbols."
- :group 'helm-elisp
- :type '(choice (function :tag "Open help for the symbol."
- helm-elisp-show-help)
- (function :tag "Show one liner in modeline."
- helm-elisp-show-doc-modeline)))
-
-\f
-;;; Show completion.
-;;
-;; Provide show completion with macro `with-helm-show-completion'.
-
-(defvar helm-show-completion-overlay nil)
-
-;; Called each time cursor move in helm-buffer.
-(defun helm-show-completion ()
- (with-helm-current-buffer
- (overlay-put helm-show-completion-overlay
- 'display (substring-no-properties
- (helm-get-selection)))))
-
-(defun helm-show-completion-init-overlay (beg end)
- (when (and helm-turn-on-show-completion beg end)
- (setq helm-show-completion-overlay (make-overlay beg end))
- (overlay-put helm-show-completion-overlay
- 'face 'helm-lisp-show-completion)))
-
-(defun helm-show-completion-display-function (buffer &rest _args)
- "A special resized helm window is used depending on position in BUFFER."
- (with-selected-window (selected-window)
- (if (window-dedicated-p)
- (helm-default-display-buffer buffer)
- (let* ((screen-size (+ (count-screen-lines (window-start) (point) t)
- 1 ; mode-line
- (if header-line-format 1 0))) ; header-line
- (def-size (- (window-height)
- helm-show-completion-min-window-height))
- (upper-height (max window-min-height (min screen-size def-size)))
- split-window-keep-point)
- (recenter -1)
- (set-window-buffer (if (active-minibuffer-window)
- (minibuffer-selected-window)
- (split-window nil upper-height
- helm-split-window-default-side))
- buffer)))))
-
-(defmacro with-helm-show-completion (beg end &rest body)
- "Show helm candidate in an overlay at point.
-BEG and END are the beginning and end position of the current completion
-in `helm-current-buffer'.
-BODY is an helm call where we want to enable show completion.
-If `helm-turn-on-show-completion' is nil just do nothing."
- (declare (indent 2) (debug t))
- `(let ((helm-move-selection-after-hook
- (and helm-turn-on-show-completion
- (append (list 'helm-show-completion)
- helm-move-selection-after-hook))))
- (with-helm-temp-hook 'helm-after-initialize-hook
- (with-helm-buffer
- (set (make-local-variable 'helm-display-function)
- (if helm-show-completion-use-special-display
- 'helm-show-completion-display-function
- 'helm-default-display-buffer))))
- (unwind-protect
- (progn
- (helm-show-completion-init-overlay ,beg ,end)
- ,@body)
- (when (and helm-turn-on-show-completion
- helm-show-completion-overlay
- (overlayp helm-show-completion-overlay))
- (delete-overlay helm-show-completion-overlay)))))
-
-\f
-;;; Lisp symbol completion.
-;;
-;;
-(defun helm-lisp-completion--predicate-at-point (beg)
- ;; Return a predicate for `all-completions'.
- (let ((fn-sym-p (lambda ()
- (or
- (and (eq (char-before) ?\ )
- (save-excursion
- (skip-syntax-backward " " (point-at-bol))
- (memq (symbol-at-point)
- helm-lisp-unquoted-function-list)))
- (and (eq (char-before) ?\')
- (save-excursion
- (forward-char -1)
- (eq (char-before) ?\#)))))))
- (save-excursion
- (goto-char beg)
- (if (or
- ;; Complete on all symbols in non--lisp modes (logs mail etc..)
- (not (memq major-mode '(emacs-lisp-mode
- lisp-interaction-mode
- inferior-emacs-lisp-mode)))
- (not (or (funcall fn-sym-p)
- (and (eq (char-before) ?\')
- (save-excursion
- (forward-char (if (funcall fn-sym-p) -2 -1))
- (skip-syntax-backward " " (point-at-bol))
- (memq (symbol-at-point)
- helm-lisp-quoted-function-list)))
- (eq (char-before) ?\())) ; no paren before str.
- ;; Looks like we are in a let statement.
- (condition-case nil
- (progn (up-list -2) (forward-char 1)
- (eq (char-after) ?\())
- (error nil)))
- (lambda (sym)
- (or (boundp sym) (fboundp sym) (symbol-plist sym)))
- #'fboundp))))
-
-(defun helm-thing-before-point (&optional limits regexp)
- "Return symbol name before point.
-If REGEXP is specified return what REGEXP find before point.
-By default match the beginning of symbol before point.
-With LIMITS arg specified return the beginning and end position
-of symbol before point."
- (save-excursion
- (let (beg
- (end (point))
- (boundary (field-beginning nil nil (point-at-bol))))
- (if (re-search-backward (or regexp "\\_<") boundary t)
- (setq beg (match-end 0))
- (setq beg boundary))
- (unless (= beg end)
- (if limits
- (cons beg end)
- (buffer-substring-no-properties beg end))))))
-
-(defun helm-bounds-of-thing-before-point (&optional regexp)
- "Get the beginning and end position of `helm-thing-before-point'.
-Return a cons \(beg . end\)."
- (helm-thing-before-point 'limits regexp))
-
-(defun helm-insert-completion-at-point (beg end str)
- ;; When there is no space after point
- ;; we are completing inside a symbol or
- ;; after a partial symbol with the next arg aside
- ;; without space, in this case mark the region.
- ;; deleting it would remove the
- ;; next arg which is unwanted.
- (delete-region beg end)
- (insert str)
- (let ((pos (cdr (or (bounds-of-thing-at-point 'symbol)
- ;; needed for helm-dabbrev.
- (bounds-of-thing-at-point 'filename)))))
- (when (and pos (< (point) pos))
- (push-mark pos t t))))
-
-(defvar helm-lisp-completion--cache nil)
-(defvar helm-lgst-len nil)
-;;;###autoload
-(defun helm-lisp-completion-at-point ()
- "Preconfigured helm for lisp symbol completion at point."
- (interactive)
- (setq helm-lgst-len 0)
- (let* ((target (helm-thing-before-point))
- (beg (car (helm-bounds-of-thing-before-point)))
- (end (point))
- (pred (and beg (helm-lisp-completion--predicate-at-point beg)))
- (loc-vars (and (fboundp 'elisp--local-variables)
- (ignore-errors
- (mapcar #'symbol-name (elisp--local-variables)))))
- (glob-syms (and target pred (all-completions target obarray pred)))
- (candidates (append loc-vars glob-syms))
- (helm-quit-if-no-candidate t)
- (helm-execute-action-at-once-if-one t)
- (enable-recursive-minibuffers t))
- (setq helm-lisp-completion--cache (cl-loop for sym in candidates
- for len = (length sym)
- when (> len helm-lgst-len)
- do (setq helm-lgst-len len)
- collect sym))
- (if candidates
- (with-helm-show-completion beg end
- ;; Overlay is initialized now in helm-current-buffer.
- (helm
- :sources (helm-build-in-buffer-source "Lisp completion"
- :data helm-lisp-completion--cache
- :persistent-action 'helm-lisp-completion-persistent-action
- :nomark t
- :fuzzy-match helm-lisp-fuzzy-completion
- :persistent-help (helm-lisp-completion-persistent-help)
- :filtered-candidate-transformer
- 'helm-lisp-completion-transformer
- :action `(lambda (candidate)
- (with-helm-current-buffer
- (run-with-timer
- 0.01 nil
- 'helm-insert-completion-at-point
- ,beg ,end candidate))))
- :input (if helm-lisp-fuzzy-completion
- target (concat target " "))
- :resume 'noresume
- :buffer "*helm lisp completion*"
- :allow-nest t))
- (message "[No Match]"))))
-
-(defun helm-lisp-completion-persistent-action (candidate &optional name)
- "Show documentation for the function.
-Documentation is shown briefly in mode-line or completely
-in other window according to the value of `helm-elisp-help-function'."
- (funcall helm-elisp-help-function candidate name))
-
-(defun helm-lisp-completion-persistent-help ()
- "Return persistent-help according to the value of `helm-elisp-help-function'"
- (cl-ecase helm-elisp-help-function
- (helm-elisp-show-doc-modeline "Show brief doc in mode-line")
- (helm-elisp-show-help "Toggle show help for the symbol")))
-
-(defun helm-elisp--show-help-1 (candidate &optional name)
- (let ((sym (intern-soft candidate)))
- (cl-typecase sym
- ((and fboundp boundp)
- (if (member name '("describe-function" "describe-variable"))
- (funcall (intern (format "helm-%s" name)) sym)
- ;; When there is no way to know what to describe
- ;; prefer describe-function.
- (helm-describe-function sym)))
- (fboundp (helm-describe-function sym))
- (bound (helm-describe-variable sym))
- (face (helm-describe-face sym)))))
-
-(defun helm-elisp-show-help (candidate &optional name)
- "Show full help for the function CANDIDATE.
-Arg NAME specify the name of the top level function
-calling helm generic completion (e.g \"describe-function\")."
- (helm-elisp--persistent-help
- candidate 'helm-elisp--show-help-1 name))
-
-(defun helm-elisp-show-doc-modeline (candidate &optional name)
- "Show brief documentation for the function in modeline."
- (let ((cursor-in-echo-area t)
- mode-line-in-non-selected-windows)
- (helm-show-info-in-mode-line
- (propertize
- (helm-get-first-line-documentation
- (intern candidate) name)
- 'face 'helm-lisp-completion-info))))
-
-(defun helm-lisp-completion-transformer (candidates _source)
- "Helm candidates transformer for lisp completion."
- (cl-loop for c in candidates
- for sym = (intern c)
- for annot = (cl-typecase sym
- (command " (Com)")
- (class " (Class)")
- (generic " (Gen)")
- (fbound " (Fun)")
- (bound " (Var)")
- (face " (Face)"))
- for spaces = (make-string (- helm-lgst-len (length c)) ? )
- collect (cons (concat c spaces annot) c) into lst
- finally return (sort lst #'helm-generic-sort-fn)))
-
-(defun helm-get-first-line-documentation (sym &optional name)
- "Return first line documentation of symbol SYM.
-If SYM is not documented, return \"Not documented\"."
- (let ((doc (cl-typecase sym
- ((and fboundp boundp)
- (cond ((string= name "describe-function")
- (documentation sym t))
- ((string= name "describe-variable")
- (documentation-property sym 'variable-documentation t))
- (t (documentation sym t))))
- (fbound (documentation sym t))
- (bound (documentation-property sym 'variable-documentation t))
- (face (face-documentation sym)))))
- (if (and doc (not (string= doc ""))
- ;; `documentation' return "\n\n(args...)"
- ;; for CL-style functions.
- (not (string-match-p "^\n\n" doc)))
- (car (split-string doc "\n"))
- "Not documented")))
-
-;;; File completion.
-;;
-;; Complete file name at point.
-
-;;;###autoload
-(defun helm-complete-file-name-at-point (&optional force)
- "Preconfigured helm to complete file name at point."
- (interactive)
- (require 'helm-mode)
- (let* ((tap (thing-at-point 'filename))
- beg
- (init (and tap
- (or force
- (save-excursion
- (end-of-line)
- (search-backward tap (point-at-bol) t)
- (setq beg (point))
- (looking-back "[^'`( ]" (1- (point)))))
- (expand-file-name
- (substring-no-properties tap))))
- (end (point))
- (helm-quit-if-no-candidate t)
- (helm-execute-action-at-once-if-one t)
- completion)
- (with-helm-show-completion beg end
- (setq completion (helm-read-file-name "FileName: "
- :initial-input init)))
- (when (and completion (not (string= completion "")))
- (delete-region beg end) (insert (if (string-match "^~" tap)
- (abbreviate-file-name completion)
- completion)))))
-
-;;;###autoload
-(defun helm-lisp-indent ()
- ;; It is meant to use with `helm-define-multi-key' which
- ;; does not support args for functions yet, so use `current-prefix-arg'
- ;; for now instead of (interactive "P").
- (interactive)
- (let ((tab-always-indent (or (eq tab-always-indent 'complete)
- tab-always-indent)))
- (indent-for-tab-command current-prefix-arg)))
-
-;;;###autoload
-(defun helm-lisp-completion-or-file-name-at-point ()
- "Preconfigured helm to complete lisp symbol or filename at point.
-Filename completion happen if string start after or between a double quote."
- (interactive)
- (let* ((tap (thing-at-point 'filename)))
- (if (and tap (save-excursion
- (end-of-line)
- (search-backward tap (point-at-bol) t)
- (looking-back "[^'`( ]" (1- (point)))))
- (helm-complete-file-name-at-point)
- (helm-lisp-completion-at-point))))
-
-\f
-;;; Apropos
-;;
-;;
-(defun helm-apropos-init (test default)
- "Init candidates buffer for `helm-apropos' sources."
- (require 'helm-help)
- (helm-init-candidates-in-buffer 'global
- (let ((default-symbol (and (stringp default)
- (intern-soft default)))
- (symbols (all-completions "" obarray test)))
- (if (and default-symbol (funcall test default-symbol))
- (cons default-symbol symbols)
- symbols))))
-
-(defun helm-apropos-init-faces (default)
- "Init candidates buffer for faces for `helm-apropos'."
- (require 'helm-help)
- (with-current-buffer (helm-candidate-buffer 'global)
- (goto-char (point-min))
- (let ((default-symbol (and (stringp default)
- (intern-soft default)))
- (faces (face-list)))
- (when (and default-symbol (facep default-symbol))
- (insert (concat default "\n")))
- (insert
- (mapconcat #'prin1-to-string
- (if default
- (cl-remove-if (lambda (sym) (string= sym default)) faces)
- faces)
- "\n")))))
-
-(defun helm-apropos-default-sort-fn (candidates _source)
- (if (string= helm-pattern "")
- candidates
- (sort candidates #'helm-generic-sort-fn)))
-
-(defun helm-def-source--emacs-variables (&optional default)
- (helm-build-in-buffer-source "Variables"
- :init `(lambda ()
- (helm-apropos-init
- (lambda (x) (and (boundp x) (not (keywordp x)))) ,default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
- 'helm-apropos-default-sort-fn)
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-variable))
- :persistent-help "Describe variable"
- :action '(("Describe variable" . helm-describe-variable)
- ("Find variable" . helm-find-variable)
- ("Info lookup" . helm-info-lookup-symbol)
- ("Set variable" . helm-set-variable))
- :action-transformer
- (lambda (actions candidate)
- (let ((sym (helm-symbolify candidate)))
- (if (custom-variable-p sym)
- (append
- actions
- (let ((standard-value (eval (car (get sym 'standard-value)))))
- (unless (equal standard-value (symbol-value sym))
- `(("Reset Variable to default value" .
- ,(lambda (candidate)
- (let ((sym (helm-symbolify candidate)))
- (set sym standard-value)))))))
- '(("Customize variable" .
- (lambda (candidate)
- (customize-option (helm-symbolify candidate))))))
- actions)))))
-
-(defun helm-def-source--emacs-faces (&optional default)
- "Create `helm' source for faces to be displayed with
-`helm-apropos'."
- (helm-build-in-buffer-source "Faces"
- :init (lambda () (helm-apropos-init-faces default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer
- (append (and (null helm-apropos-fuzzy-match)
- '(helm-apropos-default-sort-fn))
- (list
- (lambda (candidates _source)
- (cl-loop for c in candidates
- collect (propertize c 'face (intern c))))))
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-face))
- :persistent-help "Describe face"
- :nomark t
- :action '(("Describe face" . helm-describe-face)
- ("Find face" . helm-find-face-definition)
- ("Customize face" . (lambda (candidate)
- (customize-face (helm-symbolify candidate)))))))
-
-(defun helm-def-source--helm-attributes (&optional _default)
- (let ((def-act (lambda (candidate)
- (let (special-display-buffer-names
- special-display-regexps
- helm-persistent-action-use-special-display)
- (with-output-to-temp-buffer "*Help*"
- (princ (get (intern candidate) 'helm-attrdoc)))))))
- (helm-build-sync-source "Helm attributes"
- :candidates (lambda ()
- (mapcar 'symbol-name helm-attributes))
- :fuzzy-match helm-apropos-fuzzy-match
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate def-act))
- :persistent-help "Describe helm attribute"
- :action def-act)))
-
-(defun helm-def-source--emacs-commands (&optional default)
- (helm-build-in-buffer-source "Commands"
- :init `(lambda ()
- (helm-apropos-init 'commandp ,default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
- 'helm-apropos-default-sort-fn)
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe command"
- :action '(("Describe function" . helm-describe-function)
- ("Find function" . helm-find-function)
- ("Info lookup" . helm-info-lookup-symbol))))
-
-(defun helm-def-source--emacs-functions (&optional default)
- (helm-build-in-buffer-source "Functions"
- :init `(lambda ()
- (helm-apropos-init (lambda (x)
- (and (fboundp x)
- (not (commandp x))
- (not (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)
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe function"
- :nomark t
- :action '(("Describe function" . helm-describe-function)
- ("Find function" . helm-find-function)
- ("Info lookup" . helm-info-lookup-symbol))))
-
-(defun helm-def-source--eieio-classes (&optional default)
- (helm-build-in-buffer-source "Classes"
- :init `(lambda ()
- (helm-apropos-init (lambda (x)
- (class-p x))
- ,default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
- 'helm-apropos-default-sort-fn)
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe class"
- :action '(("Describe function" . helm-describe-function)
- ("Find function" . helm-find-function)
- ("Info lookup" . helm-info-lookup-symbol))))
-
-(defun helm-def-source--eieio-generic (&optional default)
- (helm-build-in-buffer-source "Generic functions"
- :init `(lambda ()
- (helm-apropos-init (lambda (x)
- (generic-p x))
- ,default))
- :fuzzy-match helm-apropos-fuzzy-match
- :filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
- 'helm-apropos-default-sort-fn)
- :nomark t
- :persistent-action (lambda (candidate)
- (helm-elisp--persistent-help
- candidate 'helm-describe-function))
- :persistent-help "Describe generic function"
- :action '(("Describe function" . helm-describe-function)
- ("Find function" . helm-find-function)
- ("Info lookup" . helm-info-lookup-symbol))))
-
-(defun helm-info-lookup-symbol-1 (c)
- (let ((helm-execute-action-at-once-if-one t)
- (helm-quit-if-no-candidate
- `(lambda ()
- (message "`%s' Not Documented as a symbol" ,c))))
- (helm :sources '(helm-source-info-elisp
- helm-source-info-cl
- helm-source-info-eieio)
- :resume 'noresume
- :buffer "*helm lookup*"
- :input c)))
-
-(defun helm-info-lookup-symbol (candidate)
- (run-with-timer 0.01 nil #'helm-info-lookup-symbol-1 candidate))
-
-(defun helm-elisp--persistent-help (candidate fun &optional name)
- (let ((hbuf (get-buffer (help-buffer))))
- (if (and (helm-attr 'help-running-p)
- (string= candidate (helm-attr 'help-current-symbol))
- (null helm-persistent-action-use-special-display))
- (progn
- ;; When started from a help buffer,
- ;; Don't kill this buffer as it is helm-current-buffer.
- (unless (equal hbuf helm-current-buffer)
- (kill-buffer hbuf)
- (set-window-buffer (get-buffer-window hbuf)
- helm-current-buffer))
- (helm-attrset 'help-running-p nil))
- (if name (funcall fun candidate name) (funcall fun candidate))
- (helm-attrset 'help-running-p t))
- (helm-attrset 'help-current-symbol candidate)))
-
-;;;###autoload
-(defun helm-apropos ()
- "Preconfigured helm to describe commands, functions, variables and faces."
- (interactive)
- (let ((default (thing-at-point 'symbol)))
- (helm :sources
- (mapcar (lambda (func)
- (funcall func default))
- helm-apropos-function-list)
- :buffer "*helm apropos*"
- :preselect (and default (concat "\\_<" (regexp-quote default) "\\_>")))))
-
-\f
-;;; Advices
-;;
-;;
-(defvar helm-source-advice
- '((name . "Function Advice")
- (candidates . helm-advice-candidates)
- (action ("Toggle Enable/Disable" . helm-advice-toggle))
- (persistent-action . helm-advice-persistent-action)
- (nomark)
- (multiline)
- (persistent-help . "Describe function / C-u C-j: Toggle advice")))
-
-(defun helm-advice-candidates ()
- (cl-loop for (fname) in ad-advised-functions
- for function = (intern fname)
- append
- (cl-loop for class in ad-advice-classes append
- (cl-loop for advice in (ad-get-advice-info-field function class)
- for enabled = (ad-advice-enabled advice)
- collect
- (cons (format
- "%s %s %s"
- (if enabled "Enabled " "Disabled")
- (propertize fname 'face 'font-lock-function-name-face)
- (ad-make-single-advice-docstring advice class nil))
- (list function class advice))))))
-
-(defun helm-advice-persistent-action (func-class-advice)
- (if current-prefix-arg
- (helm-advice-toggle func-class-advice)
- (describe-function (car func-class-advice))))
-
-(defun helm-advice-toggle (func-class-advice)
- (cl-destructuring-bind (function _class advice) func-class-advice
- (cond ((ad-advice-enabled advice)
- (ad-advice-set-enabled advice nil)
- (message "Disabled"))
- (t
- (ad-advice-set-enabled advice t)
- (message "Enabled")))
- (ad-activate function)
- (and helm-in-persistent-action
- (helm-advice-update-current-display-string))))
-
-(defun helm-advice-update-current-display-string ()
- (helm-edit-current-selection
- (let ((newword (cond ((looking-at "Disabled") "Enabled")
- ((looking-at "Enabled") "Disabled"))))
- (when newword
- (delete-region (point) (progn (forward-word 1) (point)))
- (insert newword)))))
-
-;;;###autoload
-(defun helm-manage-advice ()
- "Preconfigured `helm' to disable/enable function advices."
- (interactive)
- (helm-other-buffer 'helm-source-advice "*helm advice*"))
-
-\f
-;;; Locate elisp library
-;;
-;;
-(defun helm-locate-library-scan-list ()
- (cl-loop for dir in load-path
- when (file-directory-p dir)
- append (directory-files dir t (concat (regexp-opt (get-load-suffixes))
- "\\'"))
- into lst
- finally return (helm-fast-remove-dups lst :test 'equal)))
-
-;;;###autoload
-(defun helm-locate-library ()
- "Preconfigured helm to locate elisp libraries."
- (interactive)
- (helm :sources (helm-build-in-buffer-source "Elisp libraries (Scan)"
- :data (lambda () (helm-locate-library-scan-list))
- :fuzzy-match t
- :keymap helm-generic-files-map
- :match-part (lambda (candidate)
- (if helm-ff-transformer-show-only-basename
- (helm-basename candidate) candidate))
- :filter-one-by-one (lambda (c)
- (if helm-ff-transformer-show-only-basename
- (cons (helm-basename c) c) c))
- :action (helm-actions-from-type-file))
- :buffer "*helm locate library*"))
-
-(defun helm-set-variable (var)
- "Set value to VAR interactively."
- (let* ((sym (helm-symbolify var))
- (val (default-value sym)))
- (set-default sym (eval-minibuffer (format "Set `%s': " var)
- (if (or (stringp val) (memq val '(nil t)))
- (prin1-to-string val)
- (format "'%s" (prin1-to-string val)))))))
-
-\f
-;;; Elisp Timers.
-;;
-;;
-(defclass helm-absolute-time-timers-class (helm-source-sync helm-type-timers)
- ((candidates :initform timer-list)
- (allow-dups :initform t)
- (candidate-transformer
- :initform
- (lambda (candidates)
- (cl-loop for timer in candidates
- collect (cons (helm-elisp--format-timer timer) timer))))))
-
-(defvar helm-source-absolute-time-timers
- (helm-make-source "Absolute Time Timers" 'helm-absolute-time-timers-class))
-
-(defclass helm-idle-time-timers-class (helm-source-sync helm-type-timers)
- ((candidates :initform timer-idle-list)
- (allow-dups :initform t)
- (candidate-transformer
- :initform
- (lambda (candidates)
- (cl-loop for timer in candidates
- collect (cons (helm-elisp--format-timer timer) timer))))))
-
-(defvar helm-source-idle-time-timers
- (helm-make-source "Idle Time Timers" 'helm-idle-time-timers-class))
-
-(defun helm-elisp--format-timer (timer)
- (format "%s repeat=%s %s(%s)"
- (let ((time (timer--time timer)))
- (if (timer--idle-delay timer)
- (format-time-string "idle-for=%5s" time)
- (format-time-string "%m/%d %T" time)))
- (or (timer--repeat-delay timer) "nil")
- (mapconcat 'identity (split-string
- (prin1-to-string (timer--function timer))
- "\n") " ")
- (mapconcat 'prin1-to-string (timer--args timer) " ")))
-
-;;;###autoload
-(defun helm-timers ()
- "Preconfigured `helm' for timers."
- (interactive)
- (helm :sources '(helm-source-absolute-time-timers
- helm-source-idle-time-timers)
- :buffer "*helm timers*"))
-
-\f
-;;; Complex command history
-;;
-;;
-(defun helm-btf--usable-p ()
- "Return t if current version of `backtrace-frame' accept 2 arguments."
- (condition-case nil
- (progn (backtrace-frame 1 'condition-case) t)
- (wrong-number-of-arguments nil)))
-
-(if (helm-btf--usable-p) ; Check if BTF accept more than one arg.
- ;; Emacs 24.4.
- (dont-compile
- (defvar helm-sexp--last-sexp nil)
- ;; This wont work compiled.
- (defun helm-sexp-eval-1 ()
- (interactive)
- (unwind-protect
- (progn
- ;; Trick called-interactively-p into thinking that `cand' is
- ;; an interactive call, See `repeat-complex-command'.
- (add-hook 'called-interactively-p-functions
- #'helm-complex-command-history--called-interactively-skip)
- (eval (read helm-sexp--last-sexp)))
- (remove-hook 'called-interactively-p-functions
- #'helm-complex-command-history--called-interactively-skip)))
-
- (defun helm-complex-command-history--called-interactively-skip (i _frame1 frame2)
- (and (eq 'eval (cadr frame2))
- (eq 'helm-sexp-eval-1
- (cadr (backtrace-frame (+ i 2) #'called-interactively-p)))
- 1))
-
- (defun helm-sexp-eval (_candidate)
- (call-interactively #'helm-sexp-eval-1)))
- ;; Emacs 24.3
- (defun helm-sexp-eval (cand)
- (let ((sexp (read cand)))
- (condition-case err
- (if (> (length (remove nil sexp)) 1)
- (eval sexp)
- (apply 'call-interactively sexp))
- (error (message "Evaluating gave an error: %S" err)
- nil)))))
-
-(defvar helm-source-complex-command-history
- (helm-build-sync-source "Complex Command History"
- :candidates (lambda ()
- ;; Use cdr to avoid adding
- ;; `helm-complex-command-history' here.
- (cl-loop for i in command-history
- unless (equal i '(helm-complex-command-history))
- collect (prin1-to-string i)))
- :action (helm-make-actions
- "Eval" (lambda (candidate)
- (and (boundp 'helm-sexp--last-sexp)
- (setq helm-sexp--last-sexp candidate))
- (run-with-timer 0.1 nil #'helm-sexp-eval candidate))
- "Edit and eval" (lambda (candidate)
- (edit-and-eval-command "Eval: " (read candidate))))
- :persistent-action #'helm-sexp-eval))
-
-;;;###autoload
-(defun helm-complex-command-history ()
- "Preconfigured helm for complex command history."
- (interactive)
- (helm :sources 'helm-source-complex-command-history
- :buffer "*helm complex commands*"))
-
-(provide 'helm-elisp)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-elisp.el ends here
+++ /dev/null
-;;; helm-elscreen.el -- Elscreen support -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-
-(declare-function elscreen-find-screen-by-buffer "ext:elscreen.el" (buffer &optional create))
-(declare-function elscreen-find-file "ext:elscreen.el" (filename))
-(declare-function elscreen-goto "ext:elscreen.el" (screen))
-(declare-function elscreen-get-conf-list "ext:elscreen.el" (type))
-
-(defun helm-find-buffer-on-elscreen (candidate)
- "Open buffer in new screen, if marked buffers open all in elscreens."
- (helm-require-or-error 'elscreen 'helm-find-buffer-on-elscreen)
- (helm-aif (helm-marked-candidates)
- (cl-dolist (i it)
- (let ((target-screen (elscreen-find-screen-by-buffer
- (get-buffer i) 'create)))
- (elscreen-goto target-screen)))
- (let ((target-screen (elscreen-find-screen-by-buffer
- (get-buffer candidate) 'create)))
- (elscreen-goto target-screen))))
-
-(defun helm-elscreen-find-file (file)
- (helm-require-or-error 'elscreen 'helm-elscreen-find-file)
- (elscreen-find-file file))
-
-(defclass helm-source-elscreen (helm-source-sync)
- ((candidates
- :initform
- (lambda ()
- (when (cdr (elscreen-get-screen-to-name-alist))
- (cl-sort (cl-loop for (screen . name) in (elscreen-get-screen-to-name-alist)
- collect (cons (format "[%d] %s" screen name) screen))
- #'< :key #'cdr))))
- (action :initform
- '(("Change Screen" .
- (lambda (candidate)
- (elscreen-goto candidate)))
- ("Kill Screen(s)" .
- (lambda (_)
- (cl-dolist (i (helm-marked-candidates))
- (elscreen-goto i)
- (elscreen-kill))))
- ("Only Screen" .
- (lambda (candidate)
- (elscreen-goto candidate)
- (elscreen-kill-others)))))
- (migemo :initform t)))
-
-(defclass helm-source-elscreen-history (helm-source-elscreen)
- ((candidates
- :initform
- (lambda ()
- (let ((sname (elscreen-get-screen-to-name-alist)))
- (when (cdr sname)
- (cl-loop for screen in (cdr (elscreen-get-conf-list 'screen-history))
- collect (cons (format "[%d] %s" screen (cdr (assq screen sname)))
- screen))))))))
-
-(defvar helm-source-elscreen-list
- (helm-make-source "ElScreen" 'helm-source-elscreen))
-
-(defvar helm-source-elscreen-history-list
- (helm-make-source "ElScreen History" 'helm-source-elscreen-history))
-
-;;;###autoload
-(defun helm-elscreen ()
- "Preconfigured helm to list elscreen."
- (interactive)
- (helm-other-buffer 'helm-source-elscreen-list "*Helm ElScreen*"))
-
-;;;###autoload
-(defun helm-elscreen-history ()
- "Preconfigured helm to list elscreen in history order."
- (interactive)
- (helm-other-buffer 'helm-source-elscreen-history-list "*Helm ElScreen*"))
-
-(provide 'helm-elscreen)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-elscreen.el ends here
+++ /dev/null
-;;; helm-eshell.el --- pcomplete and eshell completion for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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/>.
-
-;;; Commentary:
-;;
-;; Enable like this in .emacs:
-;; (add-hook 'eshell-mode-hook
-;; (lambda ()
-;; (eshell-cmpl-initialize)
-;; (define-key eshell-mode-map [remap pcomplete] 'helm-esh-pcomplete)
-;; (define-key eshell-mode-map (kbd "M-p") 'helm-eshell-history)))
-
-
-;;; Code:
-(require 'cl-lib)
-(require 'helm)
-(require 'helm-lib)
-(require 'helm-help)
-(require 'helm-elisp)
-
-(declare-function eshell-read-aliases-list "em-alias")
-(declare-function eshell-send-input "esh-mode" (&optional use-region queue-p no-newline))
-(declare-function eshell-bol "esh-mode")
-(declare-function eshell-parse-arguments "esh-arg" (beg end))
-(declare-function eshell-backward-argument "esh-mode" (&optional arg))
-(declare-function helm-quote-whitespace "helm-lib")
-
-\f
-(defgroup helm-eshell nil
- "Helm eshell completion and history."
- :group 'helm)
-
-(defcustom helm-eshell-hist-ignoredups nil
- "Same as `eshell-hist-ignoredups' which see but for helm."
- :group 'helm-eshell
- :type 'boolean)
-
-\f
-(defvar helm-eshell-history-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-p") 'helm-next-line)
- map)
- "Keymap for `helm-eshell-history'.")
-
-(defvar helm-esh-completion-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "TAB") 'helm-next-line)
- map)
- "Keymap for `helm-esh-pcomplete'.")
-
-\f
-(defclass helm-esh-source (helm-source-sync)
- ((init :initform (lambda ()
- (setq pcomplete-current-completions nil
- pcomplete-last-completion-raw nil)
- ;; Eshell-command add this hook in all minibuffers
- ;; Remove it for the helm one. (Fixed in Emacs24)
- (remove-hook 'minibuffer-setup-hook 'eshell-mode)))
- (candidates :initform 'helm-esh-get-candidates)
- (nomark :initform t)
- (persistent-action :initform 'ignore)
- (filtered-candidate-transformer
- :initform
- (lambda (candidates _sources)
- (cl-loop
- for i in candidates
- collect
- (cond ((string-match "\\`~/?" helm-ec-target)
- (abbreviate-file-name i))
- ((string-match "\\`/" helm-ec-target) i)
- (t
- (file-relative-name i)))
- into lst
- finally return (sort lst 'helm-generic-sort-fn))))
- (action :initform 'helm-ec-insert))
- "Helm class to define source for Eshell completion.")
-
-;; Internal.
-(defvar helm-ec-target "")
-(defun helm-ec-insert (candidate)
- "Replace text at point with CANDIDATE.
-The function that call this should set `helm-ec-target' to thing at point."
- (let ((pt (point)))
- (when (and helm-ec-target
- (search-backward helm-ec-target nil t)
- (string= (buffer-substring (point) pt) helm-ec-target))
- (delete-region (point) pt)))
- (when (string-match "\\`\\*" helm-ec-target) (insert "*"))
- (cond ((string-match "\\`~/?" helm-ec-target)
- (insert (helm-quote-whitespace (abbreviate-file-name candidate))))
- ((string-match "\\`/" helm-ec-target)
- (insert (helm-quote-whitespace candidate)))
- (t
- (insert (concat (and (string-match "\\`[.]/" helm-ec-target) "./")
- (helm-quote-whitespace
- (file-relative-name candidate)))))))
-
-(defun helm-esh-get-candidates ()
- "Get candidates for eshell completion using `pcomplete'."
- (catch 'pcompleted
- (with-helm-current-buffer
- (let* ((pcomplete-stub)
- pcomplete-seen pcomplete-norm-func
- pcomplete-args pcomplete-last pcomplete-index
- (pcomplete-autolist pcomplete-autolist)
- (pcomplete-suffix-list pcomplete-suffix-list)
- (table (pcomplete-completions))
- (entry (or (try-completion helm-pattern
- (pcomplete-entries))
- helm-pattern)))
- (cl-loop ;; expand entry too to be able to compare it with file-cand.
- with exp-entry = (and (stringp entry)
- (not (string= entry ""))
- (file-name-as-directory
- (expand-file-name entry default-directory)))
- for i in (all-completions pcomplete-stub table)
- ;; Transform the related names to abs names.
- for file-cand = (and exp-entry
- (if (file-remote-p i) i
- (expand-file-name
- i (file-name-directory entry))))
- ;; Compare them to avoid dups.
- for file-entry-p = (and (stringp exp-entry)
- (stringp file-cand)
- ;; Fix :/tmp/foo/ $ cd foo
- (not (file-directory-p file-cand))
- (file-equal-p exp-entry file-cand))
- if (and file-cand (or (file-remote-p file-cand)
- (file-exists-p file-cand))
- (not file-entry-p))
- collect file-cand into ls
- else
- ;; Avoid adding entry here.
- unless file-entry-p collect i into ls
- finally return
- (if (and exp-entry
- (file-directory-p exp-entry)
- ;; If the car of completion list is
- ;; an executable, probably we are in
- ;; command completion, so don't add a
- ;; possible file related entry here.
- (and ls (not (executable-find (car ls))))
- ;; Don't add entry if already in prompt.
- (not (file-equal-p exp-entry pcomplete-stub)))
- (append (list exp-entry)
- ;; Entry should not be here now but double check.
- (remove entry ls))
- ls))))))
-\f
-;;; Eshell history.
-;;
-;;
-(defclass helm-eshell-history-source (helm-source-in-buffer)
- ((init :initform
- (lambda ()
- (let ((eshell-hist-ignoredups helm-eshell-hist-ignoredups))
- (eshell-write-history eshell-history-file-name t)
- (with-current-buffer (helm-candidate-buffer 'global)
- (insert-file-contents eshell-history-file-name)))
- ;; Same comment as in `helm-source-esh'
- (remove-hook 'minibuffer-setup-hook 'eshell-mode)))
- (nomark :initform t)
- (keymap :initform helm-eshell-history-map)
- (filtered-candidate-transformer :initform (lambda (candidates sources)
- (reverse candidates)))
- (candidate-number-limit :initform 9999)
- (action :initform (lambda (candidate)
- (eshell-kill-input)
- (insert candidate))))
- "Helm class to define source for Eshell history.")
-
-\f
-;;;###autoload
-(defun helm-esh-pcomplete ()
- "Preconfigured helm to provide helm completion in eshell."
- (interactive)
- (let* ((helm-quit-if-no-candidate t)
- (helm-execute-action-at-once-if-one t)
- (end (point-marker))
- (beg (save-excursion (eshell-bol) (point)))
- (args (catch 'eshell-incomplete
- (eshell-parse-arguments beg end)))
- (target
- (or (and (looking-back " " (1- (point))) " ")
- (buffer-substring-no-properties
- (save-excursion
- (eshell-backward-argument 1) (point))
- end)))
- (first (car args)) ; Maybe lisp delimiter "(".
- last ; Will be the last but parsed by pcomplete.
- del-space)
- (setq helm-ec-target (or target " ")
- end (point)
- ;; Reset beg for `with-helm-show-completion'.
- beg (or (and target (not (string= target " "))
- (- end (length target)))
- ;; Nothing at point.
- (progn (insert " ") (setq del-space t) (point))))
- (cond ((eq first ?\()
- (helm-lisp-completion-or-file-name-at-point))
- ;; In eshell `pcomplete-parse-arguments' is called
- ;; with `pcomplete-parse-arguments-function'
- ;; locally bound to `eshell-complete-parse-arguments'
- ;; which is calling `lisp-complete-symbol',
- ;; calling it before would popup the
- ;; *completions* buffer.
- (t (setq last (replace-regexp-in-string
- "\\`\\*" ""
- (car (last (ignore-errors
- (pcomplete-parse-arguments))))))
- (with-helm-show-completion beg end
- (or (helm :sources (helm-make-source "Eshell completions" 'helm-esh-source)
- :buffer "*helm pcomplete*"
- :keymap helm-esh-completion-map
- :resume 'noresume
- :input (and (stringp last)
- (helm-ff-set-pattern last)))
- (and del-space (looking-back "\\s-" (1- (point)))
- (delete-char -1))))))))
-
-;;;###autoload
-(defun helm-eshell-history ()
- "Preconfigured helm for eshell history."
- (interactive)
- (let* ((end (point))
- (beg (save-excursion (eshell-bol) (point)))
- (input (buffer-substring beg end))
- flag-empty)
- (when (eq beg end)
- (insert " ")
- (setq flag-empty t)
- (setq end (point)))
- (unwind-protect
- (with-helm-show-completion beg end
- (helm :sources (helm-make-source "Eshell history"
- 'helm-eshell-history-source)
- :buffer "*helm eshell history*"
- :resume 'noresume
- :input input))
- (when (and flag-empty
- (looking-back " " (1- (point))))
- (delete-char -1)))))
-
-(provide 'helm-eshell)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-eshell ends here
+++ /dev/null
-;;; helm-eval.el --- eval expressions from helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'eldoc)
-(require 'edebug)
-
-\f
-(defgroup helm-eval nil
- "Eval related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-eldoc-in-minibuffer-show-fn
- 'helm-show-info-in-mode-line
- "A function to display eldoc info.
-Should take one arg: the string to display."
- :group 'helm-eval
- :type 'symbol)
-
-(defcustom helm-show-info-in-mode-line-delay 12
- "Eldoc will show info in mode-line during this delay if user is idle."
- :type 'integer
- :group 'helm-eval)
-
-\f
-;;; Eldoc compatibility between emacs-24 and emacs-25
-;;
-(if (require 'elisp-mode nil t) ; emacs-25
- ;; Maybe the eldoc functions have been
- ;; already aliased by eldoc-eval.
- (cl-loop for (f . a) in '((eldoc-current-symbol .
- elisp--current-symbol)
- (eldoc-fnsym-in-current-sexp .
- elisp--fnsym-in-current-sexp)
- (eldoc-get-fnsym-args-string .
- elisp-get-fnsym-args-string)
- (eldoc-get-var-docstring .
- elisp-get-var-docstring))
- unless (fboundp f)
- do (defalias f a))
- ;; Emacs-24.
- (declare-function eldoc-current-symbol "eldoc")
- (declare-function eldoc-get-fnsym-args-string "eldoc" (sym &optional index))
- (declare-function eldoc-get-var-docstring "eldoc" (sym))
- (declare-function eldoc-fnsym-in-current-sexp "eldoc"))
-
-;;; Evaluation Result
-;;
-;;
-;; Internal
-(defvar helm-eldoc-active-minibuffers-list nil)
-
-(defvar helm-eval-expression-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "<C-return>") 'helm-eval-new-line-and-indent)
- (define-key map (kbd "<M-tab>") 'lisp-indent-line)
- (define-key map (kbd "<C-tab>") 'helm-lisp-completion-at-point)
- (define-key map (kbd "C-p") 'previous-line)
- (define-key map (kbd "C-n") 'next-line)
- (define-key map (kbd "<up>") 'previous-line)
- (define-key map (kbd "<down>") 'next-line)
- (define-key map (kbd "<right>") 'forward-char)
- (define-key map (kbd "<left>") 'backward-char)
- map))
-
-(defun helm-build-evaluation-result-source ()
- (helm-build-dummy-source "Evaluation Result"
- :multiline t
- :mode-line "C-RET: nl-and-indent, M-tab: reindent, C-tab:complete, C-p/n: next/prec-line."
- :filtered-candidate-transformer (lambda (_candidates _source)
- (list
- (condition-case nil
- (with-helm-current-buffer
- (pp-to-string
- (if edebug-active
- (edebug-eval-expression
- (read helm-pattern))
- (eval (read helm-pattern)))))
- (error "Error"))))
- :nohighlight t
- :action '(("Copy result to kill-ring" . (lambda (candidate)
- (kill-new
- (replace-regexp-in-string
- "\n" "" candidate))
- (message "Result copied to kill-ring")))
- ("copy sexp to kill-ring" . (lambda (_candidate)
- (kill-new helm-input)
- (message "Sexp copied to kill-ring"))))))
-
-(defun helm-eval-new-line-and-indent ()
- (interactive)
- (newline) (lisp-indent-line))
-
-(defun helm-eldoc-store-minibuffer ()
- "Store minibuffer buffer name in `helm-eldoc-active-minibuffers-list'."
- (with-selected-window (minibuffer-window)
- (push (current-buffer) helm-eldoc-active-minibuffers-list)))
-
-(defun helm-eldoc-show-in-eval ()
- "Return eldoc in mode-line for current minibuffer input."
- (let ((buf (window-buffer (active-minibuffer-window))))
- (condition-case err
- (when (member buf helm-eldoc-active-minibuffers-list)
- (with-current-buffer buf
- (let* ((sym (save-excursion
- (unless (looking-back ")\\|\"" (1- (point)))
- (forward-char -1))
- (eldoc-current-symbol)))
- (info-fn (eldoc-fnsym-in-current-sexp))
- (doc (or (eldoc-get-var-docstring sym)
- (eldoc-get-fnsym-args-string
- (car info-fn) (cadr info-fn)))))
- (when doc (funcall helm-eldoc-in-minibuffer-show-fn doc)))))
- (error (message "Eldoc in minibuffer error: %S" err) nil))))
-
-(defun helm-show-info-in-mode-line (str)
- "Display string STR in mode-line."
- (save-selected-window
- (with-current-buffer helm-buffer
- (let ((mode-line-format (concat " " str)))
- (force-mode-line-update)
- (sit-for helm-show-info-in-mode-line-delay))
- (force-mode-line-update))))
-
-;;; Calculation Result
-;;
-;;
-(defvar helm-source-calculation-result
- (helm-build-dummy-source "Calculation Result"
- :filtered-candidate-transformer (lambda (_candidates _source)
- (list
- (condition-case nil
- (calc-eval helm-pattern)
- (error "error"))))
- :nohighlight t
- :action '(("Copy result to kill-ring" . (lambda (candidate)
- (kill-new candidate)
- (message "Result \"%s\" copied to kill-ring"
- candidate)))
- ("Copy operation to kill-ring" . (lambda (_candidate)
- (kill-new helm-input)
- (message "Calculation copied to kill-ring"))))))
-
-;;;###autoload
-(defun helm-eval-expression (arg)
- "Preconfigured helm for `helm-source-evaluation-result'."
- (interactive "P")
- (helm :sources (helm-build-evaluation-result-source)
- :input (when arg (thing-at-point 'sexp))
- :buffer "*helm eval*"
- :echo-input-in-header-line nil
- :history 'read-expression-history
- :keymap helm-eval-expression-map))
-
-(defvar eldoc-idle-delay)
-;;;###autoload
-(defun helm-eval-expression-with-eldoc ()
- "Preconfigured helm for `helm-source-evaluation-result' with `eldoc' support. "
- (interactive)
- (let ((timer (run-with-idle-timer
- eldoc-idle-delay 'repeat
- 'helm-eldoc-show-in-eval)))
- (unwind-protect
- (minibuffer-with-setup-hook
- 'helm-eldoc-store-minibuffer
- (call-interactively 'helm-eval-expression))
- (and timer (cancel-timer timer))
- (setq helm-eldoc-active-minibuffers-list
- (cdr helm-eldoc-active-minibuffers-list)))))
-
-;;;###autoload
-(defun helm-calcul-expression ()
- "Preconfigured helm for `helm-source-calculation-result'."
- (interactive)
- (helm :sources 'helm-source-calculation-result
- :buffer "*helm calcul*"))
-
-(provide 'helm-eval)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-eval.el ends here
+++ /dev/null
-;;; helm-external.el --- Run Externals commands within Emacs with helm completion. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-net)
-
-\f
-(defgroup helm-external nil
- "External related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-raise-command 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\"."
- :type 'string
- :group 'helm-external)
-
-(defcustom helm-external-programs-associations nil
- "Alist to store externals programs associated with file extension.
-This variable overhide setting in .mailcap file.
-e.g : '\(\(\"jpg\" . \"gqview\"\) (\"pdf\" . \"xpdf\"\)\) "
- :type '(alist :key-type string :value-type string)
- :group 'helm-external)
-
-(defcustom helm-default-external-file-browser "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 external file browser
-or do not want to use it.
-Windows users should set that to \"explorer.exe\"."
- :group 'helm-external
- :type 'string)
-
-\f
-;;; Internals
-(defvar helm-external-command-history nil)
-(defvar helm-external-commands-list nil
- "A list of all external commands the user can execute.
-If this variable is not set by the user, it will be calculated
-automatically.")
-
-(defun helm-external-commands-list-1 (&optional sort)
- "Returns a list of all external commands the user can execute.
-If `helm-external-commands-list' is non-nil it will
-return its contents. Else it calculates all external commands
-and sets `helm-external-commands-list'."
- (helm-aif helm-external-commands-list
- it
- (setq helm-external-commands-list
- (cl-loop
- for dir in (split-string (getenv "PATH") path-separator)
- when (and (file-exists-p dir) (file-accessible-directory-p dir))
- for lsdir = (cl-loop for i in (directory-files dir t)
- for bn = (file-name-nondirectory i)
- when (and (not (member bn completions))
- (not (file-directory-p i))
- (file-executable-p i))
- collect bn)
- append lsdir into completions
- finally return
- (if sort (sort completions 'string-lessp) completions)))))
-
-(defun helm-run-or-raise (exe &optional file)
- "Generic command that run asynchronously EXE.
-If EXE is already running just jump to his window if `helm-raise-command'
-is non--nil.
-When FILE argument is provided run EXE with FILE.
-In this case EXE must be provided as \"EXE %s\"."
- (let* ((real-com (car (split-string (replace-regexp-in-string
- "%s" "" exe))))
- (proc (if file (concat real-com " " file) real-com))
- process-connection-type)
- (if (get-process proc)
- (if helm-raise-command
- (shell-command (format helm-raise-command real-com))
- (error "Error: %s is already running" real-com))
- (when (cl-loop for i in helm-external-commands-list thereis (string= real-com i))
- (message "Starting %s..." real-com)
- (if file
- (start-process-shell-command
- proc nil (format exe (shell-quote-argument
- (if (eq system-type 'windows-nt)
- (helm-w32-prepare-filename file)
- file))))
- (start-process-shell-command proc nil real-com))
- (set-process-sentinel
- (get-process proc)
- (lambda (process event)
- (when (and (string= event "finished\n")
- helm-raise-command
- (not (helm-get-pid-from-process-name real-com)))
- (shell-command (format helm-raise-command "emacs")))
- (message "%s process...Finished." process))))
- (setq helm-external-commands-list
- (cons real-com
- (delete real-com helm-external-commands-list))))))
-
-(defun helm-get-mailcap-for-file (filename)
- "Get the command to use for FILENAME from mailcap files.
-The command is like <command %s> and is meant to use with `format'."
- (mailcap-parse-mailcaps)
- (let* ((ext (file-name-extension filename))
- (mime (when ext (mailcap-extension-to-mime ext)))
- (result (when mime (mailcap-mime-info mime))))
- ;; If elisp file have no associations in .mailcap
- ;; `mailcap-maybe-eval' is returned, in this case just return nil.
- (when (stringp result) result)))
-
-(defun helm-get-default-program-for-file (filename)
- "Try to find a default program to open FILENAME.
-Try first in `helm-external-programs-associations' and then in mailcap file
-if nothing found return nil."
- (let* ((ext (file-name-extension filename))
- (def-prog (assoc-default ext helm-external-programs-associations)))
- (cond ((and def-prog (not (string= def-prog "")))
- (concat def-prog " %s"))
- ((and helm-default-external-file-browser
- (file-directory-p filename))
- (concat helm-default-external-file-browser " %s"))
- (t (helm-get-mailcap-for-file filename)))))
-
-(defun helm-open-file-externally (file)
- "Open FILE with an external program.
-Try to guess which program to use with `helm-get-default-program-for-file'.
-If not found or a prefix arg is given query the user which tool to use."
- (let* ((fname (expand-file-name file))
- (collection (helm-external-commands-list-1 'sort))
- (def-prog (helm-get-default-program-for-file fname))
- (real-prog-name (if (or helm-current-prefix-arg (not def-prog))
- ;; Prefix arg or no default program.
- (prog1
- (helm-comp-read
- "Program: " collection
- :must-match t
- :name "Open file Externally"
- :del-input nil
- :history helm-external-command-history)
- ;; Always prompt to set this program as default.
- (setq def-prog nil))
- ;; No prefix arg or default program exists.
- (replace-regexp-in-string " %s\\| '%s'" "" def-prog)))
- (program (concat real-prog-name " %s")))
- (unless (or def-prog ; Association exists, no need to record it.
- ;; Don't try to record non--filenames associations (e.g urls).
- (not (file-exists-p fname)))
- (when
- (y-or-n-p
- (format
- "Do you want to make `%s' the default program for this kind of files? "
- real-prog-name))
- (helm-aif (assoc (file-name-extension fname)
- helm-external-programs-associations)
- (setq helm-external-programs-associations
- (delete it helm-external-programs-associations)))
- (push (cons (file-name-extension fname)
- (helm-read-string
- "Program (Add args maybe and confirm): " real-prog-name))
- helm-external-programs-associations)
- (customize-save-variable 'helm-external-programs-associations
- helm-external-programs-associations)))
- (helm-run-or-raise program file)
- (setq helm-external-command-history
- (cons real-prog-name
- (delete real-prog-name
- (cl-loop for i in helm-external-command-history
- when (executable-find i) collect i))))))
-
-;;;###autoload
-(defun 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'."
- (interactive (list
- (helm-comp-read
- "RunProgram: "
- (helm-external-commands-list-1 'sort)
- :must-match t
- :del-input nil
- :name "External Commands"
- :history helm-external-command-history)))
- (helm-run-or-raise program)
- (setq helm-external-command-history
- (cons program (delete program
- (cl-loop for i in helm-external-command-history
- when (executable-find i) collect i)))))
-
-
-(provide 'helm-external)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-external ends here
+++ /dev/null
-;;; helm-files.el --- helm file browser and related. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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:
-\f
-(require 'cl-lib)
-(require 'helm)
-(require 'helm-types)
-(require 'helm-utils)
-(require 'helm-external)
-(require 'helm-grep)
-(require 'helm-help)
-(require 'helm-locate)
-(require 'helm-bookmark)
-(require 'helm-tags)
-(require 'helm-buffers)
-(require 'thingatpt)
-(require 'ffap)
-(require 'dired-aux)
-(require 'dired-x)
-(require 'tramp)
-(require 'image-dired)
-
-(declare-function find-library-name "find-func.el" (library))
-(declare-function w32-shell-execute "ext:w32fns.c" (operation document &optional parameters show-flag))
-(declare-function gnus-dired-attach "ext:gnus-dired.el" (files-to-attach))
-(declare-function image-dired-display-image "image-dired.el" (file &optional original-size))
-(declare-function image-dired-update-property "image-dired.el" (prop value))
-(declare-function eshell-read-aliases-list "em-alias")
-(declare-function eshell-send-input "esh-mode" (&optional use-region queue-p no-newline))
-(declare-function eshell-kill-input "esh-mode")
-(declare-function eshell-bol "esh-mode")
-(declare-function eshell-quote-argument "esh-arg.el")
-(declare-function helm-ls-git-ls "ext:helm-ls-git")
-(declare-function helm-hg-find-files-in-project "ext:helm-ls-hg")
-(declare-function helm-gid "helm-id-utils.el")
-(declare-function helm-ls-svn-ls "ext:helm-ls-svn")
-
-(defvar recentf-list)
-(defvar helm-mm-matching-method)
-
-\f
-(defgroup helm-files nil
- "Files applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-boring-file-regexp-list
- (mapcar (lambda (f)
- (concat
- (rx-to-string
- (replace-regexp-in-string
- "/$" "" f) t) "$"))
- completion-ignored-extensions)
- "The regexp list matching boring files."
- :group 'helm-files
- :type '(repeat (choice regexp)))
-
-(defcustom helm-for-files-preferred-list
- '(helm-source-buffers-list
- helm-source-recentf
- helm-source-bookmarks
- helm-source-file-cache
- helm-source-files-in-current-dir
- helm-source-locate)
- "Your preferred sources to find files."
- :type '(repeat (choice symbol))
- :group 'helm-files)
-
-(defcustom helm-tramp-verbose 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."
- :type 'integer
- :group 'helm-files)
-
-(defcustom helm-ff-auto-update-initial-value nil
- "Auto update when only one candidate directory is matched.
-Default value when starting `helm-find-files' is nil because
-it prevent using <backspace> to delete char backward and by the way
-confuse beginners.
-For a better experience with `helm-find-files' set this to non--nil
-and use C-<backspace> to toggle it."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-lynx-style-map t
- "Use arrow keys to navigate with `helm-find-files'.
-You will have to restart Emacs or reeval `helm-find-files-map'
-and `helm-read-file-map' for this take effect."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-history-max-length 100
- "Number of elements shown in `helm-find-files' history."
- :group 'helm-files
- :type 'integer)
-
-(defcustom helm-ff-fuzzy-matching t
- "Enable fuzzy matching for `helm-find-files' when non--nil.
-See `helm-ff--transform-pattern-for-completion' for more info."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-tramp-not-fancy t
- "No colors when listing remote files when set to non--nil.
-This make listing much faster, specially on slow machines."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-exif-data-program "exiftran"
- "Program used to extract exif data of an image file."
- :group 'helm-files
- :type 'string)
-
-(defcustom helm-ff-exif-data-program-args "-d"
- "Arguments used for `helm-ff-exif-data-program'."
- :group 'helm-files
- :type 'string)
-
-(defcustom helm-ff-newfile-prompt-p t
- "Whether Prompt or not when creating new file.
-This set `ffap-newfile-prompt'."
- :type 'boolean
- :group 'helm-files)
-
-(defcustom helm-ff-avfs-directory "~/.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/>."
- :type 'string
- :group 'helm-files)
-
-(defcustom helm-ff-file-compressed-list '("gz" "bz2" "zip" "7z")
- "Minimal list of compressed files extension."
- :type '(repeat (choice string))
- :group 'helm-files)
-
-(defcustom helm-ff-printer-list 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."
- :type '(repeat (choice string))
- :group 'helm-files)
-
-(defcustom helm-ff-transformer-show-only-basename t
- "Show only basename of candidates in `helm-find-files'.
-This can be toggled at anytime from `helm-find-files' with \
-\\<helm-find-files-map>\\[helm-ff-run-toggle-basename]."
- :type 'boolean
- :group 'helm-files)
-
-(defcustom helm-ff-signal-error-on-dot-files 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."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-search-library-in-sexp nil
- "Search for library in `require' and `declare-function' sexp."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-tooltip-hide-delay 25
- "Hide tooltips automatically after this many seconds."
- :group 'helm-files
- :type 'integer)
-
-(defcustom helm-ff-file-name-history-use-recentf nil
- "Use `recentf-list' instead of `file-name-history' in `helm-find-files'."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-skip-boring-files nil
- "Non--nil to skip files matching regexps in `helm-boring-file-regexp-list'.
-This take effect in `helm-find-files' and file completion used by `helm-mode'
-i.e `helm-read-file-name'."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-candidate-number-limit 5000
- "The `helm-candidate-number-limit' for `helm-find-files', `read-file-name' and friends."
- :group 'helm-files
- :type 'integer)
-
-(defcustom helm-findutils-skip-boring-files t
- "Ignore files matching regexps in `completion-ignored-extensions'."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-findutils-search-full-path 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."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-files-save-history-extra-sources
- '("Find" "Locate" "Recentf"
- "Files from Current Directory" "File Cache")
- "Extras source that save candidate to `file-name-history'."
- :group 'helm-files
- :type '(repeat (choice string)))
-
-(defcustom helm-find-files-before-init-hook nil
- "Hook that run before initialization of `helm-find-files'."
- :group 'helm-files
- :type 'hook)
-
-(defcustom helm-find-files-after-init-hook nil
- "Hook that run after initialization of `helm-find-files'."
- :group 'helm-files
- :type 'hook)
-
-(defcustom helm-multi-files-toggle-locate-binding "C-c p"
- "Default binding to switch back and forth locate in `helm-multi-files'."
- :group 'helm-files
- :type 'string)
-
-(defcustom helm-find-files-bookmark-prefix "Helm-find-files: "
- "bookmark name prefix of `helm-find-files' sessions."
- :group 'helm-files
- :type 'string)
-
-(defcustom helm-ff-guess-ffap-filenames 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."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-ff-guess-ffap-urls 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."
- :group 'helm-files
- :type 'boolean)
-
-(defcustom helm-substitute-in-filename-stay-on-remote nil
- "Don't switch back to local filesystem when expanding pattern with / or ~/."
- :group 'helm-files
- :type 'boolean)
-
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-files-faces nil
- "Customize the appearance of helm-files."
- :prefix "helm-"
- :group 'helm-files
- :group 'helm-faces)
-
-(defface helm-ff-prefix
- '((t (:background "yellow" :foreground "black")))
- "Face used to prefix new file or url paths in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-executable
- '((t (:foreground "green")))
- "Face used for executable files in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-directory
- '((t (:foreground "DarkRed" :background "LightGray")))
- "Face used for directories in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-dotted-directory
- '((t (:foreground "black" :background "DimGray")))
- "Face used for dotted directories in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-dotted-symlink-directory
- '((t (:foreground "DarkOrange" :background "DimGray")))
- "Face used for dotted symlinked directories in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-symlink
- '((t (:foreground "DarkOrange")))
- "Face used for symlinks in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-invalid-symlink
- '((t (:foreground "black" :background "red")))
- "Face used for invalid symlinks in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-ff-file
- '((t (:inherit font-lock-builtin-face)))
- "Face used for file names in `helm-find-files'."
- :group 'helm-files-faces)
-
-(defface helm-history-deleted
- '((t (:inherit helm-ff-invalid-symlink)))
- "Face used for deleted files in `file-name-history'."
- :group 'helm-files-faces)
-
-(defface helm-history-remote
- '((t (:foreground "Indianred1")))
- "Face used for remote files in `file-name-history'."
- :group 'helm-files-faces)
-
-\f
-;;; Helm-find-files - The helm file browser.
-;;
-;; Keymaps
-(defvar helm-find-files-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-]") 'helm-ff-run-toggle-basename)
- (define-key map (kbd "C-x C-f") 'helm-ff-run-locate)
- (define-key map (kbd "C-x C-d") 'helm-ff-run-browse-project)
- (define-key map (kbd "C-x r m") 'helm-ff-bookmark-set)
- (define-key map (kbd "C-x r b") 'helm-find-files-toggle-to-bookmark)
- (define-key map (kbd "C-s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g p") 'helm-ff-run-pdfgrep)
- (define-key map (kbd "M-g z") 'helm-ff-run-zgrep)
- (define-key map (kbd "M-g a") 'helm-ff-run-grep-ag)
- (define-key map (kbd "M-g g") 'helm-ff-run-git-grep)
- (define-key map (kbd "M-g i") 'helm-ff-run-gid)
- (define-key map (kbd "M-.") 'helm-ff-run-etags)
- (define-key map (kbd "M-R") 'helm-ff-run-rename-file)
- (define-key map (kbd "M-C") 'helm-ff-run-copy-file)
- (define-key map (kbd "M-B") 'helm-ff-run-byte-compile-file)
- (define-key map (kbd "M-L") 'helm-ff-run-load-file)
- (define-key map (kbd "M-S") 'helm-ff-run-symlink-file)
- (define-key map (kbd "M-H") 'helm-ff-run-hardlink-file)
- (define-key map (kbd "M-D") 'helm-ff-run-delete-file)
- (define-key map (kbd "M-K") 'helm-ff-run-kill-buffer-persistent)
- (define-key map (kbd "C-c d") 'helm-ff-persistent-delete)
- (define-key map (kbd "M-e") 'helm-ff-run-switch-to-eshell)
- (define-key map (kbd "C-c i") 'helm-ff-run-complete-fn-at-point)
- (define-key map (kbd "C-c o") 'helm-ff-run-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-ff-run-switch-other-frame)
- (define-key map (kbd "C-c C-x") 'helm-ff-run-open-file-externally)
- (define-key map (kbd "C-c X") 'helm-ff-run-open-file-with-default-tool)
- (define-key map (kbd "M-!") 'helm-ff-run-eshell-command-on-file)
- (define-key map (kbd "M-%") 'helm-ff-run-query-replace-on-marked)
- (define-key map (kbd "C-c =") 'helm-ff-run-ediff-file)
- (define-key map (kbd "M-=") 'helm-ff-run-ediff-merge-file)
- (define-key map (kbd "M-p") 'helm-ff-run-switch-to-history)
- (define-key map (kbd "C-c h") 'helm-ff-file-name-history)
- (define-key map (kbd "M-i") 'helm-ff-properties-persistent)
- (define-key map (kbd "C-}") 'helm-narrow-window)
- (define-key map (kbd "C-{") 'helm-enlarge-window)
- (define-key map (kbd "C-<backspace>") 'helm-ff-run-toggle-auto-update)
- (define-key map (kbd "C-c <DEL>") 'helm-ff-run-toggle-auto-update)
- (define-key map (kbd "C-c C-a") 'helm-ff-run-gnus-attach-files)
- (define-key map (kbd "C-c p") 'helm-ff-run-print-file)
- (define-key map (kbd "C-c /") 'helm-ff-run-find-sh-command)
- ;; 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 "C-l") 'helm-find-files-up-one-level)
- (define-key map (kbd "C-r") 'helm-find-files-down-last-level)
- (define-key map (kbd "C-c r") 'helm-ff-run-find-file-as-root)
- (define-key map (kbd "C-x C-v") 'helm-ff-run-find-alternate-file)
- (define-key map (kbd "C-c @") 'helm-ff-run-insert-org-link)
- (helm-define-key-with-subkeys map (kbd "DEL") ?\d 'helm-ff-delete-char-backward
- nil nil 'helm-ff-delete-char-backward--exit-fn)
- (when helm-ff-lynx-style-map
- (define-key map (kbd "<left>") 'helm-find-files-up-one-level)
- (define-key map (kbd "<right>") 'helm-execute-persistent-action))
- (delq nil map))
- "Keymap for `helm-find-files'.")
-
-(defvar helm-read-file-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "<C-return>") 'helm-cr-empty-string)
- (define-key map (kbd "<M-RET>") 'helm-cr-empty-string)
- (define-key map (kbd "C-]") 'helm-ff-run-toggle-basename)
- (define-key map (kbd "C-.") 'helm-find-files-up-one-level)
- (define-key map (kbd "C-l") 'helm-find-files-up-one-level)
- (define-key map (kbd "C-r") 'helm-find-files-down-last-level)
- (define-key map (kbd "C-c h") 'helm-ff-file-name-history)
- (define-key map (kbd "C-<backspace>") 'helm-ff-run-toggle-auto-update)
- (define-key map (kbd "C-c <DEL>") 'helm-ff-run-toggle-auto-update)
- (helm-define-key-with-subkeys map (kbd "DEL") ?\d 'helm-ff-delete-char-backward
- nil nil 'helm-ff-delete-char-backward--exit-fn)
- (when helm-ff-lynx-style-map
- (define-key map (kbd "<left>") 'helm-find-files-up-one-level)
- (define-key map (kbd "<right>") 'helm-execute-persistent-action)
- (define-key map (kbd "<M-left>") 'helm-previous-source)
- (define-key map (kbd "<M-right>") 'helm-next-source))
- (delq nil map))
- "Keymap for `helm-read-file-name'.")
-
-\f
-;; Internal.
-(defvar helm-find-files-doc-header " (\\<helm-find-files-map>\\[helm-find-files-up-one-level]: Go up one level)"
- "*The doc that is inserted in the Name header of a find-files or dired source.")
-(defvar helm-ff-auto-update-flag nil
- "Internal, flag to turn on/off auto-update in `helm-find-files'.
-Don't set it directly, use instead `helm-ff-auto-update-initial-value'.")
-(defvar helm-ff-last-expanded nil
- "Store last expanded directory or file.")
-(defvar helm-ff-default-directory nil)
-(defvar helm-ff-history nil)
-(defvar helm-ff-cand-to-mark nil)
-(defvar helm-ff-url-regexp
- "\\`\\(news\\(post\\)?:\\|nntp:\\|mailto:\\|file:\\|\\(ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\):/?/?\\).*"
- "Same as `ffap-url-regexp' but match earlier possible url.")
-(defvar helm-tramp-file-name-regexp "\\`/\\([^[/:]+\\|[^/]+]\\):")
-(defvar helm-marked-buffer-name "*helm marked*")
-(defvar helm-ff--auto-update-state nil)
-(defvar helm-ff--deleting-char-backward nil)
-(defvar helm-multi-files--toggle-locate nil)
-(defvar helm-ff--move-to-first-real-candidate t)
-(defvar helm-find-files--toggle-bookmark nil)
-
-\f
-;;; Helm-find-files
-;;
-;;
-(defcustom helm-find-files-actions
- (helm-make-actions
- "Find File" 'helm-find-file-or-marked
- "Find file in Dired" 'helm-point-file-in-dired
- (lambda () (and (locate-library "elscreen") "Find file in Elscreen"))
- 'helm-elscreen-find-file
- "View file" 'view-file
- "Checksum File" 'helm-ff-checksum
- "Query replace fnames on marked" 'helm-ff-query-replace-on-marked
- "Query replace contents on marked" 'helm-ff-query-replace
- "Query replace regexp contents on marked" 'helm-ff-query-replace-regexp
- "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" '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
- "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" 'helm-find-files-ag
- "Git grep" 'helm-ff-git-grep
- "Zgrep File(s) `M-g z, C-u Recurse'" 'helm-ff-zgrep
- "Gid" 'helm-ff-gid
- "Switch to Eshell `M-e'" 'helm-ff-switch-to-eshell
- "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" 'find-alternate-file
- "Ediff File `C-='" 'helm-find-files-ediff-files
- "Ediff Merge File `C-c ='" 'helm-find-files-ediff-merge-files
- "Delete File(s) `M-D'" 'helm-delete-marked-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
- "Find file other window `C-c o'" 'helm-find-files-other-window
- "Switch to history `M-p'" 'helm-find-files-switch-to-hist
- "Find file other frame `C-c C-o'" 'find-file-other-frame
- "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)
- "Actions for `helm-find-files'."
- :group 'helm-files
- :type '(alist :key-type string :value-type function))
-
-(defvar helm-source-find-files nil
- "The main source to browse files.
-Should not be used among other sources.")
-
-(defclass helm-source-ffiles (helm-source-sync)
- ((header-name
- :initform (lambda (name)
- (concat name (substitute-command-keys
- helm-find-files-doc-header))))
- (init
- :initform (lambda ()
- (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)))
- (candidates :initform 'helm-find-files-get-candidates)
- (filtered-candidate-transformer :initform 'helm-ff-sort-candidates)
- (filter-one-by-one :initform 'helm-ff-filter-candidate-one-by-one)
- (persistent-action :initform 'helm-find-files-persistent-action)
- (persistent-help :initform "Hit1 Expand Candidate, Hit2 or (C-u) Find file")
- (help-message :initform 'helm-ff-help-message)
- (volatile :initform t)
- (migemo :initform t)
- (nohighlight :initform t)
- (keymap :initform helm-find-files-map)
- (candidate-number-limit :initform 'helm-ff-candidate-number-limit)
- (action-transformer
- :initform 'helm-find-files-action-transformer)
- (action :initform 'helm-find-files-actions)
- (before-init-hook :initform 'helm-find-files-before-init-hook)
- (after-init-hook :initform 'helm-find-files-after-init-hook)))
-
-;; Bookmark handlers.
-;;
-(defun helm-ff-make-bookmark-record ()
- "The `bookmark-make-record-function' for `helm-find-files'."
- (with-helm-buffer
- `((filename . ,helm-ff-default-directory)
- (presel . ,(helm-get-selection))
- (handler . helm-ff-bookmark-jump))))
-
-(defun helm-ff-bookmark-jump (bookmark)
- "bookmark handler for `helm-find-files'."
- (let ((fname (bookmark-prop-get bookmark 'filename))
- (presel (bookmark-prop-get bookmark 'presel)))
- (helm-find-files-1 fname (if helm-ff-transformer-show-only-basename
- (helm-basename presel)
- presel))))
-
-(defun helm-ff-bookmark-set ()
- "Record `helm-find-files' session in bookmarks."
- (interactive)
- (with-helm-alive-p
- (with-helm-buffer
- (bookmark-set
- (concat helm-find-files-bookmark-prefix
- (abbreviate-file-name helm-ff-default-directory))))
- (message "Helm find files session bookmarked! ")))
-(put 'helm-ff-bookmark-set 'helm-only t)
-
-(defun helm-dwim-target-directory ()
- "Return value of `default-directory' of buffer in other window.
-If there is only one window return the value ot `default-directory'
-for current buffer."
- (with-helm-current-buffer
- (let ((num-windows (length (remove (get-buffer-window helm-marked-buffer-name)
- (window-list)))))
- (expand-file-name
- (if (> num-windows 1)
- (save-selected-window
- (other-window 1)
- default-directory)
- ;; Using the car of *ff-history allow
- ;; allow staying in the directory visited instead of current.
- (or (car-safe helm-ff-history) default-directory))))))
-
-(defun helm-find-files-do-action (action)
- "Generic function for creating actions from `helm-source-find-files'.
-ACTION must be an action supported by `helm-dired-action'."
- (let* ((ifiles (mapcar 'expand-file-name ; Allow modify '/foo/.' -> '/foo'
- (helm-marked-candidates :with-wildcard t)))
- (cand (helm-get-selection)) ; Target
- (prompt (format "%s %s file(s) to: "
- (capitalize (symbol-name action))
- (length ifiles)))
- helm-ff--move-to-first-real-candidate
- (helm-always-two-windows t)
- (helm-reuse-last-window-split-state t)
- (helm-split-window-default-side
- (eq helm-split-window-default-side 'same))
- helm-split-window-in-side-p
- (parg helm-current-prefix-arg)
- helm-display-source-at-screen-top ; prevent setting window-start.
- helm-ff-auto-update-initial-value
- (dest (with-helm-display-marked-candidates
- helm-marked-buffer-name
- (mapcar (lambda (f)
- (if (file-directory-p f)
- (concat (helm-basename f) "/")
- (helm-basename f)))
- ifiles)
- (with-helm-current-buffer
- (helm-read-file-name
- prompt
- :preselect (unless (cdr ifiles)
- (if helm-ff-transformer-show-only-basename
- (helm-basename cand) cand))
- :initial-input (helm-dwim-target-directory)
- :history (helm-find-files-history :comp-read nil))))))
- (helm-dired-action
- dest :files ifiles :action action :follow parg)))
-
-(defun helm-find-files-copy (_candidate)
- "Copy files from `helm-find-files'."
- (helm-find-files-do-action 'copy))
-
-(defun helm-find-files-rename (_candidate)
- "Rename files from `helm-find-files'."
- (helm-find-files-do-action 'rename))
-
-(defun helm-find-files-symlink (_candidate)
- "Symlink files from `helm-find-files'."
- (helm-find-files-do-action 'symlink))
-
-(defun helm-find-files-relsymlink (_candidate)
- "Relsymlink files from `helm-find-files'."
- (helm-find-files-do-action 'relsymlink))
-
-(defun helm-find-files-hardlink (_candidate)
- "Hardlink files from `helm-find-files'."
- (helm-find-files-do-action 'hardlink))
-
-(defun helm-find-files-other-window (_candidate)
- "Keep current-buffer and open files in separate windows."
- (let* ((files (helm-marked-candidates))
- (buffers (mapcar 'find-file-noselect files)))
- (switch-to-buffer-other-window (car buffers))
- (helm-aif (cdr buffers)
- (save-selected-window
- (cl-loop for buffer in it
- do (progn
- (select-window (split-window))
- (switch-to-buffer buffer)))))))
-
-(defun helm-find-files-byte-compile (_candidate)
- "Byte compile elisp files from `helm-find-files'."
- (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))))
-
-(defun helm-find-files-load-files (_candidate)
- "Load elisp files from `helm-find-files'."
- (let ((files (helm-marked-candidates :with-wildcard t)))
- (cl-loop for fname in files
- do (load fname))))
-
-(defun helm-find-files-ediff-files-1 (candidate &optional merge)
- "Generic function to ediff/merge files in `helm-find-files'."
- (let* ((bname (helm-basename candidate))
- (marked (helm-marked-candidates :with-wildcard t))
- (prompt (if merge "Ediff Merge `%s' With File: "
- "Ediff `%s' With File: "))
- (fun (if merge 'ediff-merge-files 'ediff-files))
- (input (helm-dwim-target-directory))
- (presel (if helm-ff-transformer-show-only-basename
- (helm-basename candidate)
- (expand-file-name
- (helm-basename candidate)
- input))))
- (if (= (length marked) 2)
- (funcall fun (car marked) (cadr marked))
- (funcall fun candidate (helm-read-file-name
- (format prompt bname)
- :initial-input input
- :preselect presel)))))
-
-(defun helm-find-files-ediff-files (candidate)
- (helm-find-files-ediff-files-1 candidate))
-
-(defun helm-find-files-ediff-merge-files (candidate)
- (helm-find-files-ediff-files-1 candidate 'merge))
-
-(defun helm-find-files-grep (_candidate)
- "Default action to grep files from `helm-find-files'."
- (helm-do-grep-1 (helm-marked-candidates :with-wildcard t)
- helm-current-prefix-arg))
-
-(defun helm-ff-git-grep (_candidate)
- "Default action to git-grep `helm-ff-default-directory'."
- (helm-grep-git-1 helm-ff-default-directory helm-current-prefix-arg))
-
-(defun helm-find-files-ag (_candidate)
- (helm-grep-ag-1 helm-ff-default-directory))
-
-(defun helm-ff-zgrep (_candidate)
- "Default action to zgrep files from `helm-find-files'."
- (helm-ff-zgrep-1 (helm-marked-candidates :with-wildcard t) helm-current-prefix-arg))
-
-(defun helm-ff-pdfgrep (_candidate)
- "Default action to pdfgrep files from `helm-find-files'."
- (let ((cands (cl-loop for file in (helm-marked-candidates :with-wildcard t)
- if (or (string= (file-name-extension file) "pdf")
- (string= (file-name-extension file) "PDF"))
- collect file))
- (helm-pdfgrep-default-function 'helm-pdfgrep-init))
- (when cands
- (helm-do-pdfgrep-1 cands))))
-
-(defun helm-ff-etags-select (candidate)
- "Default action to jump to etags from `helm-find-files'."
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (let* ((source-name (assoc-default 'name (helm-get-current-source)))
- (default-directory (if (string= source-name "Find Files")
- helm-ff-default-directory
- (file-name-directory candidate))))
- (helm-etags-select helm-current-prefix-arg)))
-
-(defun helm-find-files-switch-to-hist (_candidate)
- "Switch to helm-find-files history."
- (helm-find-files t))
-
-(defvar eshell-command-aliases-list nil)
-(defvar helm-eshell-command-on-file-input-history nil)
-(defun helm-find-files-eshell-command-on-file-1 (&optional map)
- "Run `eshell-command' on CANDIDATE or marked candidates.
-This is done possibly with an eshell alias, if no alias found, you can type in
-an eshell command.
-
-Basename of CANDIDATE can be a wild-card.
-e.g you can do \"eshell-command command *.el\"
-Where \"*.el\" is the CANDIDATE.
-
-It is possible to do eshell-command command <CANDIDATE> <some more args>
-like this: \"command %s some more args\".
-
-If MAP is given run `eshell-command' on all marked files at once,
-Otherwise, run `eshell-command' on each marked files.
-In other terms, with a prefix arg do on the three marked files
-\"foo\" \"bar\" \"baz\":
-
-\"eshell-command command foo bar baz\"
-
-otherwise do
-
-\"eshell-command command foo\"
-\"eshell-command command bar\"
-\"eshell-command command baz\"
-
-Note:
-If `eshell' or `eshell-command' have not been run once,
-or if you have no eshell aliases `eshell-command-aliases-list'
-will not be loaded first time you use this."
- (when (or eshell-command-aliases-list
- (y-or-n-p "Eshell is not loaded, run eshell-command without alias anyway? "))
- (and eshell-command-aliases-list (eshell-read-aliases-list))
- (let* ((cand-list (helm-marked-candidates))
- (default-directory (or helm-ff-default-directory
- ;; If candidate is an url *-ff-default-directory is nil
- ;; so keep value of default-directory.
- default-directory))
- (command (helm-comp-read
- "Command: "
- (cl-loop for (a . c) in eshell-command-aliases-list
- when (string-match "\\(\\$1\\|\\$\\*\\)$" (car c))
- collect (propertize a 'help-echo (car c)) into ls
- finally return (sort ls 'string<))
- :buffer "*helm eshell on file*"
- :name "Eshell command"
- :mode-line
- '("Eshell alias"
- "C-h m: Help, \\[universal-argument]: Insert output at point")
- :help-message 'helm-esh-help-message
- :input-history
- 'helm-eshell-command-on-file-input-history))
- (alias-value (car (assoc-default command eshell-command-aliases-list)))
- cmd-line)
- (if (or (equal helm-current-prefix-arg '(16))
- (equal map '(16)))
- ;; Two time C-u from `helm-comp-read' mean print to current-buffer.
- ;; i.e `eshell-command' will use this value.
- (setq current-prefix-arg '(16))
- ;; Else reset the value of `current-prefix-arg'
- ;; to avoid printing in current-buffer.
- (setq current-prefix-arg nil))
- (if (and (or
- ;; One prefix-arg have been passed before `helm-comp-read'.
- ;; If map have been set with C-u C-u (value == '(16))
- ;; ignore it.
- (and map (equal map '(4)))
- ;; One C-u from `helm-comp-read'.
- (equal helm-current-prefix-arg '(4))
- ;; An alias that finish with $*
- (and alias-value
- ;; If command is an alias be sure it accept
- ;; more than one arg i.e $*.
- (string-match "\\$\\*$" alias-value)))
- (cdr cand-list))
-
- ;; Run eshell-command with ALL marked files as arguments.
- ;; This wont work on remote files, because tramp handlers depends
- ;; on `default-directory' (limitation).
- (let ((mapfiles (mapconcat 'eshell-quote-argument cand-list " ")))
- (if (string-match "'%s'\\|\"%s\"\\|%s" command)
- (setq cmd-line (format command mapfiles)) ; See [1]
- (setq cmd-line (format "%s %s" command mapfiles)))
- (helm-log "%S" cmd-line)
- (eshell-command cmd-line))
-
- ;; Run eshell-command on EACH marked files.
- ;; To work with tramp handler we have to call
- ;; COMMAND on basename of each file, using
- ;; its basedir as `default-directory'.
- (cl-loop for f in cand-list
- for dir = (and (not (string-match ffap-url-regexp f))
- (helm-basedir f))
- for file = (eshell-quote-argument
- (format "%s" (if (and dir (file-remote-p dir))
- (helm-basename f) f)))
- for com = (if (string-match "'%s'\\|\"%s\"\\|%s" command)
- ;; [1] This allow to enter other args AFTER filename
- ;; i.e <command %s some_more_args>
- (format command file)
- (format "%s %s" command file))
- do (let ((default-directory (or dir default-directory)))
- (eshell-command com)))))))
-
-(defun helm-find-files-eshell-command-on-file (_candidate)
- "Run `eshell-command' on CANDIDATE or marked candidates.
-See `helm-find-files-eshell-command-on-file-1' for more info."
- (helm-find-files-eshell-command-on-file-1 helm-current-prefix-arg))
-
-(defun helm-ff-switch-to-eshell (_candidate)
- "Switch to eshell and cd to `helm-ff-default-directory'."
- (let ((cd-eshell (lambda ()
- (eshell-kill-input)
- (goto-char (point-max))
- (insert
- (format "cd '%s'" helm-ff-default-directory))
- (eshell-send-input))))
- (if (get-buffer "*eshell*")
- (switch-to-buffer "*eshell*")
- (call-interactively 'eshell))
- (unless (get-buffer-process (current-buffer))
- (funcall cd-eshell))))
-
-(defun helm-ff-serial-rename-action (method)
- "Rename all marked files in `helm-ff-default-directory' with METHOD.
-See `helm-ff-serial-rename-1'."
- (let* ((helm--reading-passwd-or-string t)
- (cands (helm-marked-candidates :with-wildcard t))
- (def-name (car cands))
- (name (helm-read-string "NewName: "
- (replace-regexp-in-string
- "[0-9]+$" ""
- (helm-basename
- def-name
- (file-name-extension def-name)))))
- (start (read-number "StartAtNumber: "))
- (extension (helm-read-string "Extension: "
- (file-name-extension (car cands))))
- (dir (expand-file-name
- (helm-read-file-name
- "Serial Rename to directory: "
- :initial-input
- (expand-file-name helm-ff-default-directory)
- :test 'file-directory-p
- :must-match t)))
- done)
- (with-helm-display-marked-candidates
- helm-marked-buffer-name (mapcar 'helm-basename cands)
- (if (y-or-n-p
- (format "Rename %s file(s) to <%s> like this ?\n%s "
- (length cands) dir (format "%s <-> %s%s.%s"
- (helm-basename (car cands))
- name start extension)))
- (progn
- (helm-ff-serial-rename-1
- dir cands name start extension :method method)
- (setq done t)
- (message nil))))
- (if done
- (with-helm-current-buffer (helm-find-files-1 dir))
- (message "Operation aborted"))))
-
-(defun helm-ff-member-directory-p (file directory)
- (let ((dir-file (expand-file-name
- (file-name-as-directory (file-name-directory file))))
- (cur-dir (expand-file-name (file-name-as-directory directory))))
- (string= dir-file cur-dir)))
-
-(cl-defun helm-ff-serial-rename-1
- (directory collection new-name start-at-num extension &key (method 'rename))
- "rename files in COLLECTION to DIRECTORY with the prefix name NEW-NAME.
-Rename start at number START-AT-NUM - ex: prefixname-01.jpg.
-EXTENSION is the file extension to use, in empty prompt,
-reuse the original extension of file.
-METHOD can be one of rename, copy or symlink.
-Files will be renamed if they are files of current directory, otherwise they
-will be treated with METHOD.
-Default METHOD is rename."
- ;; Maybe remove directories selected by error in collection.
- (setq collection (cl-remove-if 'file-directory-p collection))
- (let* ((tmp-dir (file-name-as-directory
- (concat (file-name-as-directory directory)
- (symbol-name (cl-gensym "tmp")))))
- (fn (cl-case method
- (copy 'copy-file)
- (symlink 'make-symbolic-link)
- (rename 'rename-file)
- (t (error "Error: Unknown method %s" method)))))
- (make-directory tmp-dir)
- (unwind-protect
- (progn
- ;; Rename all files to tmp-dir with new-name.
- ;; If files are not from start directory, use method
- ;; to move files to tmp-dir.
- (cl-loop for i in collection
- for count from start-at-num
- for fnum = (if (< count 10) "0%s" "%s")
- for nname = (concat tmp-dir new-name (format fnum count)
- (if (not (string= extension ""))
- (format ".%s" (replace-regexp-in-string
- "[.]" "" extension))
- (file-name-extension i 'dot)))
- do (if (helm-ff-member-directory-p i directory)
- (rename-file i nname)
- (funcall fn i nname)))
- ;; Now move all from tmp-dir to destination.
- (cl-loop with dirlist = (directory-files
- tmp-dir t directory-files-no-dot-files-regexp)
- for f in dirlist do
- (if (file-symlink-p f)
- (make-symbolic-link (file-truename f)
- (concat (file-name-as-directory directory)
- (helm-basename f)))
- (rename-file f directory))))
- (delete-directory tmp-dir t))))
-
-(defun helm-ff-serial-rename (_candidate)
- "Serial rename all marked files to `helm-ff-default-directory'.
-Rename only file of current directory, and symlink files coming from
-other directories.
-See `helm-ff-serial-rename-1'."
- (helm-ff-serial-rename-action 'rename))
-
-(defun helm-ff-serial-rename-by-symlink (_candidate)
- "Serial rename all marked files to `helm-ff-default-directory'.
-Rename only file of current directory, and symlink files coming from
-other directories.
-See `helm-ff-serial-rename-1'."
- (helm-ff-serial-rename-action 'symlink))
-
-(defun helm-ff-serial-rename-by-copying (_candidate)
- "Serial rename all marked files to `helm-ff-default-directory'.
-Rename only file of current directory, and copy files coming from
-other directories.
-See `helm-ff-serial-rename-1'."
- (helm-ff-serial-rename-action 'copy))
-
-(defun helm-ff-query-replace-on-marked-1 (candidates)
- "Query replace on filenames of CANDIDATES.
-This doesn't replace inside the files, only modify filenames."
- (with-helm-display-marked-candidates
- helm-marked-buffer-name
- (mapcar 'helm-basename candidates)
- (let* ((regexp (read-string "Replace regexp on filename(s): "))
- (str (read-string (format "Replace regexp `%s' with: " regexp))))
- (cl-loop with query = "y"
- with count = 0
- for old in candidates
- for new = (concat (helm-basedir old)
- (replace-regexp-in-string
- regexp str
- (helm-basename old)))
- ;; If `regexp' is not matched in `old'
- ;; `replace-regexp-in-string' will
- ;; return `old' unmodified.
- unless (string= old new)
- do (progn
- (unless (string= query "!")
- (while (not (member
- (setq query
- (string
- (read-key
- (propertize
- (format
- "Replace `%s' by `%s' [!,y,n,q]"
- old new)
- 'face 'minibuffer-prompt))))
- '("y" "!" "n" "q")))
- (message "Please answer by y,n,! or q") (sit-for 1)))
- (when (string= query "q")
- (cl-return (message "Operation aborted")))
- (unless (string= query "n")
- (rename-file old new)
- (cl-incf count)))
- finally (message "%d Files renamed" count))))
- ;; This fix the emacs bug where "Emacs-Lisp:" is sent
- ;; in minibuffer (not the echo area).
- (sit-for 0.1)
- (with-current-buffer (window-buffer (minibuffer-window))
- (delete-minibuffer-contents)))
-
-;; The action.
-(defun helm-ff-query-replace-on-marked (_candidate)
- (let ((marked (helm-marked-candidates :with-wildcard t)))
- (helm-ff-query-replace-on-marked-1 marked)))
-
-;; The command for `helm-find-files-map'.
-(defun helm-ff-run-query-replace-on-marked ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-query-replace-on-marked)))
-(put 'helm-ff-run-query-replace-on-marked 'helm-only t)
-
-(defun helm-ff-query-replace (_candidate)
- (let ((bufs (cl-loop for f in (helm-marked-candidates :with-wildcard t)
- collect (buffer-name (find-file-noselect f)))))
- (helm-buffer-query-replace-1 nil bufs)))
-
-(defun helm-ff-query-replace-regexp (_candidate)
- (let ((bufs (cl-loop for f in (helm-marked-candidates :with-wildcard t)
- collect (buffer-name (find-file-noselect f)))))
- (helm-buffer-query-replace-1 'regexp bufs)))
-
-(defun helm-ff-run-query-replace ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-query-replace)))
-(put 'helm-ff-run-query-replace 'helm-only t)
-
-(defun helm-ff-run-query-replace-regexp ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-query-replace-regexp)))
-(put 'helm-ff-run-query-replace-regexp 'helm-only t)
-
-(defun helm-ff-toggle-auto-update (_candidate)
- (setq helm-ff-auto-update-flag (not helm-ff-auto-update-flag))
- (setq helm-ff--auto-update-state helm-ff-auto-update-flag)
- (message "[Auto expansion %s]"
- (if helm-ff-auto-update-flag "enabled" "disabled")))
-
-(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-execute-persistent-action 'toggle-auto-update)))
-(put 'helm-ff-run-toggle-auto-update 'helm-only t)
-
-(defun helm-ff-delete-char-backward ()
- "Disable helm find files auto update and delete char backward."
- (interactive)
- (with-helm-alive-p
- (setq helm-ff-auto-update-flag nil)
- (setq helm-ff--deleting-char-backward t)
- (call-interactively
- (lookup-key (current-global-map)
- (read-kbd-macro "DEL")))))
-(put 'helm-ff-delete-char-backward 'helm-only t)
-
-(defun helm-ff-delete-char-backward--exit-fn ()
- (setq helm-ff-auto-update-flag helm-ff--auto-update-state)
- (setq helm-ff--deleting-char-backward nil))
-
-(defun helm-ff-run-switch-to-history ()
- "Run Switch to history action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (when (helm-file-completion-source-p)
- (helm-exit-and-execute-action 'helm-find-files-switch-to-hist))))
-(put 'helm-ff-run-switch-to-history 'helm-only t)
-
-(defun helm-ff-run-grep ()
- "Run Grep action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-grep)))
-(put 'helm-ff-run-grep 'helm-only t)
-
-(defun helm-ff-run-git-grep ()
- "Run git-grep action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-git-grep)))
-(put 'helm-ff-run-git-grep 'helm-only t)
-
-(defun helm-ff-run-grep-ag ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-ag)))
-(put 'helm-ff-run-grep-ag 'helm-only t)
-
-(defun helm-ff-run-pdfgrep ()
- "Run Pdfgrep action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-pdfgrep)))
-(put 'helm-ff-run-pdfgrep 'helm-only t)
-
-(defun helm-ff-run-zgrep ()
- "Run Grep action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-zgrep)))
-(put 'helm-ff-run-zgrep 'helm-only t)
-
-(defun helm-ff-run-copy-file ()
- "Run Copy file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-copy)))
-(put 'helm-ff-run-copy-file 'helm-only t)
-
-(defun helm-ff-run-rename-file ()
- "Run Rename file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-rename)))
-(put 'helm-ff-run-rename-file 'helm-only t)
-
-(defun helm-ff-run-byte-compile-file ()
- "Run Byte compile file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-byte-compile)))
-(put 'helm-ff-run-byte-compile-file 'helm-only t)
-
-(defun helm-ff-run-load-file ()
- "Run Load file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-load-files)))
-(put 'helm-ff-run-load-file 'helm-only t)
-
-(defun helm-ff-run-eshell-command-on-file ()
- "Run eshell command on file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- 'helm-find-files-eshell-command-on-file)))
-(put 'helm-ff-run-eshell-command-on-file 'helm-only t)
-
-(defun helm-ff-run-ediff-file ()
- "Run Ediff file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-ediff-files)))
-(put 'helm-ff-run-ediff-file 'helm-only t)
-
-(defun helm-ff-run-ediff-merge-file ()
- "Run Ediff merge file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- 'helm-find-files-ediff-merge-files)))
-(put 'helm-ff-run-ediff-merge-file 'helm-only t)
-
-(defun helm-ff-run-symlink-file ()
- "Run Symlink file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-symlink)))
-(put 'helm-ff-run-symlink-file 'helm-only t)
-
-(defun helm-ff-run-hardlink-file ()
- "Run Hardlink file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-hardlink)))
-(put 'helm-ff-run-hardlink-file 'helm-only t)
-
-(defun helm-ff-run-delete-file ()
- "Run Delete file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-delete-marked-files)))
-(put 'helm-ff-run-delete-file 'helm-only t)
-
-(defun helm-ff-run-complete-fn-at-point ()
- "Run complete file name action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- 'helm-insert-file-name-completion-at-point)))
-(put 'helm-ff-run-complete-fn-at-point 'helm-only t)
-
-(defun helm-ff-run-switch-to-eshell ()
- "Run switch to eshell action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-switch-to-eshell)))
-(put 'helm-ff-run-switch-to-eshell 'helm-only t)
-
-(defun helm-ff-run-switch-other-window ()
- "Run switch to other window action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-files-other-window)))
-(put 'helm-ff-run-switch-other-window 'helm-only t)
-
-(defun helm-ff-run-switch-other-frame ()
- "Run switch to other frame action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'find-file-other-frame)))
-(put 'helm-ff-run-switch-other-frame 'helm-only t)
-
-(defun helm-ff-run-open-file-externally ()
- "Run open file externally command action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-open-file-externally)))
-(put 'helm-ff-run-open-file-externally 'helm-only t)
-
-(defun helm-ff-run-open-file-with-default-tool ()
- "Run open file externally command action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-open-file-with-default-tool)))
-(put 'helm-ff-run-open-file-with-default-tool 'helm-only t)
-
-(defun helm-ff-locate (candidate)
- "Locate action function for `helm-find-files'."
- (helm-locate-set-command)
- (let ((input (concat (helm-basename
- (expand-file-name
- candidate
- helm-ff-default-directory))
- ;; The locate '-b' option doesn't exists
- ;; in everything (es).
- (unless (and (eq system-type 'windows-nt)
- (string-match "^es" helm-locate-command))
- " -b"))))
- (helm-locate-1 helm-current-prefix-arg nil 'from-ff input)))
-
-(defun helm-ff-run-locate ()
- "Run locate action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-locate)))
-(put 'helm-ff-run-locate 'helm-only t)
-
-(defun helm-files-insert-as-org-link (candidate)
- (insert (format "[[%s][]]" candidate))
- (goto-char (- (point) 2)))
-
-(defun helm-ff-run-insert-org-link ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-files-insert-as-org-link)))
-(put 'helm-ff-run-insert-org-link 'helm-only t)
-
-(defun helm-ff-run-find-file-as-root ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-find-file-as-root)))
-(put 'helm-ff-run-find-file-as-root 'helm-only t)
-
-(defun helm-ff-run-find-alternate-file ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'find-alternate-file)))
-(put 'helm-ff-run-find-alternate-file 'helm-only t)
-
-(defun helm-ff-run-gnus-attach-files ()
- "Run gnus attach files command action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-gnus-attach-files)))
-(put 'helm-ff-run-gnus-attach-files 'helm-only t)
-
-(defun helm-ff-run-etags ()
- "Run Etags command action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-etags-select)))
-(put 'helm-ff-run-etags 'helm-only t)
-
-(defvar lpr-printer-switch)
-(defun helm-ff-print (_candidate)
- "Print marked files.
-
-You may to set in order
-variables `lpr-command',`lpr-switches' and/or `printer-name',
-but with no settings helm should detect your printer(s) and
-print with the default `lpr' settings.
-
-NOTE: DO NOT set the \"-P\" flag in `lpr-switches', if you really
-have to modify this, do it in `lpr-printer-switch'.
-
-Same as `dired-do-print' but for helm."
- (require 'lpr)
- (when (or helm-current-prefix-arg
- (not helm-ff-printer-list))
- (setq helm-ff-printer-list
- (helm-ff-find-printers)))
- (let* ((file-list (helm-marked-candidates :with-wildcard t))
- (len (length file-list))
- (printer-name (if helm-ff-printer-list
- (helm-comp-read
- "Printer: " helm-ff-printer-list)
- printer-name))
- (lpr-switches
- (if (and (stringp printer-name)
- (string< "" printer-name))
- (cons (concat lpr-printer-switch printer-name)
- lpr-switches)
- lpr-switches))
- (command (helm-read-string
- (format "Print *%s File(s):\n%s with: "
- len
- (mapconcat
- (lambda (f) (format "- %s\n" f))
- file-list ""))
- (when (and lpr-command lpr-switches)
- (mapconcat 'identity
- (cons lpr-command
- (if (stringp lpr-switches)
- (list lpr-switches)
- lpr-switches))
- " "))))
- (file-args (mapconcat (lambda (x)
- (format "'%s'" x))
- file-list " "))
- (cmd-line (concat command " " file-args)))
- (if command
- (start-process-shell-command "helm-print" nil cmd-line)
- (error "Error: Please verify your printer settings in Emacs."))))
-
-(defun helm-ff-run-print-file ()
- "Run Print file action from `helm-source-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-print)))
-(put 'helm-ff-run-print-file 'helm-only t)
-
-(defun helm-ff-checksum (file)
- "Calculate the checksum of FILE.
-The checksum is copied to kill-ring."
- (let ((algo (intern (helm-comp-read
- "Algorithm: "
- '(md5 sha1 sha224 sha256 sha384 sha512)))))
- (kill-new (with-temp-buffer
- (insert-file-contents-literally file)
- (secure-hash algo (current-buffer))))
- (message "Checksum copied to kill-ring.")))
-
-(defun helm-ff-toggle-basename (_candidate)
- (with-helm-buffer
- (setq helm-ff-transformer-show-only-basename
- (not helm-ff-transformer-show-only-basename))
- (let* ((cand (helm-get-selection nil t))
- (target (if helm-ff-transformer-show-only-basename
- (helm-basename cand) cand)))
- (helm-force-update (regexp-quote target)))))
-
-(defun helm-ff-run-toggle-basename ()
- (interactive)
- (with-helm-alive-p
- (unless (helm-empty-source-p)
- (helm-ff-toggle-basename nil))))
-(put 'helm-ff-run-toggle-basename 'helm-only t)
-
-(cl-defun helm-reduce-file-name (fname level &key unix-close expand)
- "Reduce FNAME by LEVEL from end or beginning depending LEVEL value.
-If LEVEL is positive reduce from end else from beginning.
-If UNIX-CLOSE is non--nil close filename with /.
-If EXPAND is non--nil expand-file-name."
- (let* ((exp-fname (expand-file-name fname))
- (fname-list (split-string
- (if (or (string= fname "~/") expand)
- exp-fname fname)
- "/" t))
- (len (length fname-list))
- (pop-list (if (< level 0)
- (cl-subseq fname-list (* level -1))
- (cl-subseq fname-list 0 (- len level))))
- (result (mapconcat 'identity pop-list "/"))
- (abbrev-fname (string-match "^~" result))
- (empty (string= result "")))
- (when unix-close (setq result (concat result "/")))
- (cond ((and abbrev-fname (string= result "~/")) "~/")
- (abbrev-fname result)
- ((and (< level 0) empty) "../")
- ((< level 0) (concat "../" result))
- ((and (eq system-type 'windows-nt)
- (not (file-remote-p fname)))
- ;; Result is starting by a volume name i.e "c:/".
- result)
- ;; Expand to "/" or "c:/".
- (empty (expand-file-name "/"))
- (t (concat "/" result)))))
-
-(defvar helm-find-files--level-tree nil)
-(defvar helm-find-files--level-tree-iterator nil)
-(defun 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."
- (interactive "p")
- (with-helm-alive-p
- (when (and (helm-file-completion-source-p)
- (not (helm-ff-invalid-tramp-name-p)))
- (with-helm-window
- (when helm-follow-mode
- (helm-follow-mode -1) (message nil)))
- ;; When going up one level we want to be at the line
- ;; corresponding to actual directory, so store this info
- ;; in `helm-ff-last-expanded'.
- (let ((cur-cand (helm-get-selection))
- (new-pattern (helm-reduce-file-name
- helm-pattern arg :unix-close t :expand t)))
- (cond ((file-directory-p helm-pattern)
- (setq helm-ff-last-expanded helm-ff-default-directory))
- ((file-exists-p helm-pattern)
- (setq helm-ff-last-expanded helm-pattern))
- ((and cur-cand (file-exists-p cur-cand))
- (setq helm-ff-last-expanded cur-cand)))
- (unless helm-find-files--level-tree
- (setq helm-find-files--level-tree
- (cons helm-ff-default-directory
- helm-find-files--level-tree)))
- (setq helm-find-files--level-tree-iterator nil)
- (push new-pattern helm-find-files--level-tree)
- (helm-set-pattern new-pattern helm-suspend-update-flag)
- (with-helm-after-update-hook (helm-ff-retrieve-last-expanded))))))
-(put 'helm-find-files-up-one-level 'helm-only t)
-
-(defun helm-find-files-down-last-level ()
- "Retrieve previous paths reached by `C-l' in helm-find-files."
- (interactive)
- (with-helm-alive-p
- (when (and (helm-file-completion-source-p)
- (not (helm-ff-invalid-tramp-name-p)))
- (unless helm-find-files--level-tree-iterator
- (setq helm-find-files--level-tree-iterator
- (helm-iter-list (cdr helm-find-files--level-tree))))
- (setq helm-find-files--level-tree nil)
- (helm-aif (helm-iter-next helm-find-files--level-tree-iterator)
- (helm-set-pattern it)
- (setq helm-find-files--level-tree-iterator nil)))))
-(put 'helm-find-files-down-last-level 'helm-only t)
-
-(defun helm-find-files--reset-level-tree ()
- (setq helm-find-files--level-tree-iterator nil
- helm-find-files--level-tree nil))
-
-(add-hook 'helm-cleanup-hook 'helm-find-files--reset-level-tree)
-(add-hook 'post-self-insert-hook 'helm-find-files--reset-level-tree)
-(add-hook 'helm-after-persistent-action-hook 'helm-find-files--reset-level-tree)
-
-(defun helm-ff-retrieve-last-expanded ()
- "Move overlay to last visited directory `helm-ff-last-expanded'.
-This happen after using `helm-find-files-up-one-level',
-or hitting C-j on \"..\"."
- (when helm-ff-last-expanded
- (let ((presel (if helm-ff-transformer-show-only-basename
- (helm-basename
- (directory-file-name helm-ff-last-expanded))
- (directory-file-name helm-ff-last-expanded))))
- (with-helm-window
- (when (re-search-forward (concat "^" (regexp-quote presel) "$") nil t)
- (forward-line 0)
- (helm-mark-current-line)))
- (setq helm-ff-last-expanded nil))))
-
-(defun helm-ff-move-to-first-real-candidate ()
- "When candidate is an incomplete file name move to first real candidate."
- (helm-aif (and (helm-file-completion-source-p)
- (not (helm-empty-source-p))
- (not (string-match
- "\\`[Dd]ired-"
- (assoc-default 'name (helm-get-current-source))))
- helm-ff--move-to-first-real-candidate
- (helm-get-selection))
- (unless (or (not (stringp it))
- (and (string-match helm-tramp-file-name-regexp it)
- (not (file-remote-p it nil t)))
- (file-exists-p it))
- (helm-next-line))))
-(add-hook 'helm-after-update-hook 'helm-ff-move-to-first-real-candidate)
-
-;;; Auto-update - helm-find-files auto expansion of directories.
-;;
-;;
-(defun helm-ff-update-when-only-one-matched ()
- "Expand to directory when sole completion.
-When only one candidate is remaining and it is a directory,
-expand to this directory.
-This happen only when `helm-ff-auto-update-flag' is non--nil
-or when `helm-pattern' is equal to \"~/\"."
- (when (and (helm-file-completion-source-p)
- (not (helm-ff-invalid-tramp-name-p)))
- (with-helm-window
- (let* ((history-p (string= (assoc-default
- 'name (helm-get-current-source))
- "Read File Name History"))
- (pat (if (string-match helm-tramp-file-name-regexp
- helm-pattern)
- (helm-create-tramp-name helm-pattern)
- helm-pattern))
- (completed-p (string= (file-name-as-directory
- (expand-file-name
- (substitute-in-file-name pat)))
- helm-ff-default-directory))
- (candnum (helm-get-candidate-number))
- (lt2-p (and (<= candnum 2)
- (>= (string-width (helm-basename helm-pattern)) 2)))
- (cur-cand (prog2
- (unless (or completed-p
- (file-exists-p pat)
- history-p (null lt2-p))
- ;; Only one non--existing candidate
- ;; and one directory candidate, move to it,
- ;; but not when renaming, copying etc...,
- ;; so for this use
- ;; `helm-ff-move-to-first-real-candidate'
- ;; instead of `helm-next-line' (Issue #910).
- (helm-ff-move-to-first-real-candidate))
- (helm-get-selection))))
- (when (and (or (and helm-ff-auto-update-flag
- (null helm-ff--deleting-char-backward)
- (not (get-buffer-window helm-action-buffer 'visible))
- ;; Issue #295
- ;; File predicates are returning t
- ;; with paths like //home/foo.
- ;; So check it is not the case by regexp
- ;; to allow user to do C-a / to start e.g
- ;; entering a tramp method e.g /sudo::.
- (not (string-match "\\`//" helm-pattern))
- (not (eq last-command 'helm-yank-text-at-point)))
- ;; Fix issue #542.
- (string= helm-pattern "~/")
- ;; Only one remaining directory, expand it.
- (and (= candnum 1)
- helm-ff--auto-update-state
- (file-accessible-directory-p pat)
- (null helm-ff--deleting-char-backward)))
- (or
- ;; Only one candidate remaining
- ;; and at least 2 char in basename.
- lt2-p
- ;; Already completed.
- completed-p)
- (not history-p) ; Don't try to auto complete in history.
- (stringp cur-cand)
- (file-accessible-directory-p cur-cand))
- (if (and (not (helm-dir-is-dot cur-cand)) ; [1]
- ;; Maybe we are here because completed-p is true
- ;; but check this again to be sure. (Windows fix)
- (<= candnum 2)) ; [2]
- ;; If after going to next line the candidate
- ;; 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 cur-cand))
- ;; 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
- ;; of name unless helm-pattern ends with "."
- ;; (i.e we are writing something starting with ".")
- (unless (string-match "\\`.*[.]\\{1\\}\\'" helm-pattern)
- (helm-set-pattern
- ;; Need to expand-file-name to avoid e.g /ssh:host:./ in prompt.
- (expand-file-name (file-name-as-directory helm-pattern)))))
- (helm-check-minibuffer-input))))))
-
-(defun helm-ff-auto-expand-to-home-or-root ()
- "Allow expanding to home/user directory or root or text yanked after pattern."
- (when (and (helm-file-completion-source-p)
- (string-match
- "/?\\$.*/\\|/\\./\\|/\\.\\./\\|/~.*/\\|//\\|\\(/[[:alpha:]]:/\\|\\s\\+\\)"
- helm-pattern)
- (with-current-buffer (window-buffer (minibuffer-window)) (eolp))
- (not (string-match helm-ff-url-regexp helm-pattern)))
- (let* ((match (match-string 0 helm-pattern))
- (input (cond ((string= match "/./")
- (expand-file-name default-directory))
- ((string= helm-pattern "/../") "/")
- ((string-match-p "\\`/\\$" match)
- (let ((sub (substitute-in-file-name match)))
- (if (file-directory-p sub)
- sub (replace-regexp-in-string "/\\'" "" sub))))
- (t (expand-file-name
- (helm-substitute-in-filename helm-pattern)
- ;; [Windows] On UNC paths "/" expand to current machine,
- ;; so use the root of current Drive. (i.e "C:/")
- (and (memq system-type '(windows-nt ms-dos))
- (getenv "SystemDrive")) ; nil on Unix.
- )))))
- (if (file-directory-p input)
- (setq helm-ff-default-directory
- (setq input (file-name-as-directory input)))
- (setq helm-ff-default-directory (file-name-as-directory
- (file-name-directory input))))
- (with-helm-window
- (helm-set-pattern input)
- (helm-check-minibuffer-input)))))
-
-(defun helm-substitute-in-filename (fname)
- "Substitute all parts of FNAME from start up to \"~/\" or \"/\".
-On windows system substitute from start up to \"/[[:lower:]]:/\".
-This function is needed for `helm-ff-auto-expand-to-home-or-root'
-and should be used carefully elsewhere, or not at all, using
-`substitute-in-file-name' instead."
- (cond ((and ffap-url-regexp
- (string-match-p ffap-url-regexp fname))
- fname)
- ((and (file-remote-p fname)
- helm-substitute-in-filename-stay-on-remote)
- (let ((sub (substitute-in-file-name fname)))
- (if (file-directory-p sub)
- sub (replace-regexp-in-string "/\\'" "" sub))))
- (t
- (with-temp-buffer
- (insert fname)
- (goto-char (point-min))
- (skip-chars-forward "/") ;; Avoid infloop in UNC paths Issue #424
- (if (re-search-forward "~.*/?\\|//\\|/[[:alpha:]]:/" nil t)
- (let ((match (match-string 0)))
- (goto-char (if (or (string= match "//")
- (string-match-p "/[[:alpha:]]:/" match))
- (1+ (match-beginning 0))
- (match-beginning 0)))
- (buffer-substring-no-properties (point) (point-at-eol)))
- fname)))))
-
-(add-hook 'helm-after-update-hook 'helm-ff-update-when-only-one-matched)
-(add-hook 'helm-after-update-hook 'helm-ff-auto-expand-to-home-or-root)
-
-(defun helm-point-file-in-dired (file)
- "Put point on filename FILE in dired buffer."
- (unless (and ffap-url-regexp
- (string-match-p ffap-url-regexp file))
- (let ((target (expand-file-name (helm-substitute-in-filename file))))
- (dired (file-name-directory target))
- (dired-goto-file target))))
-
-(defun helm-create-tramp-name (fname)
- "Build filename for `helm-pattern' like /su:: or /sudo::."
- (apply #'tramp-make-tramp-file-name
- (cl-loop with v = (tramp-dissect-file-name fname)
- for i across v collect i)))
-
-(cl-defun helm-ff-tramp-hostnames (&optional (pattern helm-pattern))
- "Get a list of hosts for tramp method found in `helm-pattern'.
-Argument PATTERN default to `helm-pattern', it is here only for debugging
-purpose."
- (when (string-match helm-tramp-file-name-regexp pattern)
- (let ((method (match-string 1 pattern))
- (tn (match-string 0 pattern))
- (all-methods (mapcar 'car tramp-methods)))
- (helm-fast-remove-dups
- (cl-loop for (f . h) in (tramp-get-completion-function method)
- append (cl-loop for e in (funcall f (car h))
- for host = (and (consp e) (cadr e))
- when (and host (not (member host all-methods)))
- collect (concat tn host)))
- :test 'equal))))
-
-(defun helm-ff-before-action-hook-fn ()
- "Exit helm when user try to execute action on an invalid tramp fname."
- (let ((cand (helm-get-selection)))
- (when (and (helm-file-completion-source-p)
- (stringp cand)
- (helm-ff-invalid-tramp-name-p cand) ; Check candidate.
- (helm-ff-invalid-tramp-name-p)) ; check helm-pattern.
- (error "Error: Unknown file or directory `%s'" cand))))
-(add-hook 'helm-before-action-hook 'helm-ff-before-action-hook-fn)
-
-(cl-defun helm-ff-invalid-tramp-name-p (&optional (pattern helm-pattern))
- "Return non--nil when PATTERN is an invalid tramp filename."
- (string= (helm-ff-set-pattern pattern)
- "Invalid tramp file name"))
-
-(defun helm-ff-set-pattern (pattern)
- "Handle tramp filenames in `helm-pattern'."
- (let ((methods (mapcar 'car tramp-methods))
- (reg "\\`/\\([^[/:]+\\|[^/]+]\\):.*:")
- cur-method tramp-name)
- ;; In some rare cases tramp can return a nil input,
- ;; so be sure pattern is a string for safety (Issue #476).
- (unless pattern (setq pattern ""))
- (cond ((string-match helm-ff-url-regexp pattern) pattern)
- ((string-match "\\`\\$" pattern)
- (substitute-in-file-name pattern))
- ((string= pattern "") "")
- ((string-match "\\`[.]\\{1,2\\}/\\'" pattern)
- (expand-file-name pattern))
- ((string-match ".*\\(~?/?[.]\\{1\\}/\\)\\'" pattern)
- (expand-file-name default-directory))
- ((string-match ".*\\(~//\\|//\\)\\'" pattern)
- (expand-file-name "/")) ; Expand to "/" or "c:/"
- ((string-match "\\`\\(~/\\|.*/~/\\)\\'" pattern)
- (expand-file-name "~/"))
- ;; Match "/method:maybe_hostname:~"
- ((and (string-match (concat reg "~") pattern)
- (setq cur-method (match-string 1 pattern))
- (member cur-method methods))
- (setq tramp-name (expand-file-name
- (helm-create-tramp-name
- (match-string 0 pattern))))
- (replace-match tramp-name nil t pattern))
- ;; Match "/method:maybe_hostname:"
- ((and (string-match reg pattern)
- (setq cur-method (match-string 1 pattern))
- (member cur-method methods))
- (setq tramp-name (helm-create-tramp-name
- (match-string 0 pattern)))
- (replace-match tramp-name nil t pattern))
- ;; Match "/hostname:"
- ((and (string-match helm-tramp-file-name-regexp pattern)
- (setq cur-method (match-string 1 pattern))
- (and cur-method (not (member cur-method methods))))
- (setq tramp-name (helm-create-tramp-name
- (match-string 0 pattern)))
- (replace-match tramp-name nil t pattern))
- ;; Match "/method:" in this case don't try to connect.
- ((and (not (string-match reg pattern))
- (string-match helm-tramp-file-name-regexp pattern)
- (member (match-string 1 pattern) methods))
- "Invalid tramp file name") ; Write in helm-buffer.
- ;; Return PATTERN unchanged.
- (t pattern))))
-
-(defun helm-find-files-get-candidates (&optional require-match)
- "Create candidate list for `helm-source-find-files'."
- (let* ((path (helm-ff-set-pattern helm-pattern))
- (dir-p (file-accessible-directory-p path))
- basedir
- invalid-basedir
- non-essential
- (tramp-verbose helm-tramp-verbose)) ; No tramp message when 0.
- (set-text-properties 0 (length path) nil path)
- ;; Issue #118 allow creation of newdir+newfile.
- (unless (or
- ;; A tramp file name not completed.
- (string= path "Invalid tramp file name")
- ;; An empty pattern
- (string= path "")
- ;; Check if base directory of PATH is valid.
- (helm-aif (file-name-directory path)
- ;; If PATH is a valid directory IT=PATH,
- ;; else IT=basedir of PATH.
- (file-directory-p it)))
- ;; BASEDIR is invalid, that's mean user is starting
- ;; to write a non--existing path in minibuffer
- ;; probably to create a 'new_dir' or a 'new_dir+new_file'.
- (setq invalid-basedir t))
- ;; Don't set now `helm-pattern' if `path' == "Invalid tramp file name"
- ;; like that the actual value (e.g /ssh:) is passed to
- ;; `helm-ff-tramp-hostnames'.
- (unless (or (string= path "Invalid tramp file name")
- invalid-basedir) ; Leave helm-pattern unchanged.
- (setq helm-ff-auto-update-flag ; [1]
- ;; Unless auto update is disabled at startup or
- ;; interactively, start auto updating only at third char.
- (unless (or (null helm-ff-auto-update-initial-value)
- (null helm-ff--auto-update-state)
- ;; But don't enable auto update when
- ;; deleting backward.
- helm-ff--deleting-char-backward
- (and dir-p (not (string-match-p "/\\'" path))))
- (or (>= (length (helm-basename path)) 3) dir-p)))
- (setq helm-pattern (helm-ff--transform-pattern-for-completion path))
- ;; This have to be set after [1] to allow deleting char backward.
- (setq basedir (expand-file-name
- (if (and dir-p helm-ff-auto-update-flag)
- ;; Add the final "/" to path
- ;; when `helm-ff-auto-update-flag' is enabled.
- (file-name-as-directory path)
- (if (string= path "") "/"
- (file-name-directory path)))))
- (setq helm-ff-default-directory
- (if (string= helm-pattern "")
- (expand-file-name "/") ; Expand to "/" or "c:/"
- ;; If path is an url *default-directory have to be nil.
- (unless (or (string-match helm-ff-url-regexp path)
- (and ffap-url-regexp
- (string-match ffap-url-regexp path)))
- basedir))))
- (cond ((string= path "Invalid tramp file name")
- (or (helm-ff-tramp-hostnames) ; Hostnames completion.
- (prog2
- ;; `helm-pattern' have not been modified yet.
- ;; Set it here to the value of `path' that should be now
- ;; "Invalid tramp file name" and set the candidates list
- ;; to ("Invalid tramp file name") to make `helm-pattern'
- ;; match single candidate "Invalid tramp file name".
- (setq helm-pattern path)
- ;; "Invalid tramp file name" is now printed
- ;; in `helm-buffer'.
- (list path))))
- ((or (and (file-regular-p path)
- (eq last-repeatable-command 'helm-execute-persistent-action))
- ;; `ffap-url-regexp' don't match until url is complete.
- (string-match helm-ff-url-regexp path)
- invalid-basedir
- (and (not (file-exists-p path)) (string-match "/$" path))
- (and ffap-url-regexp (string-match ffap-url-regexp path)))
- (list path))
- ((string= path "") (helm-ff-directory-files "/" t))
- ;; Check here if directory is accessible (not working on Windows).
- ((and (file-directory-p path) (not (file-readable-p path)))
- (list (format "file-error: Opening directory permission denied `%s'" path)))
- ;; A fast expansion of PATH is made only if `helm-ff-auto-update-flag'
- ;; is enabled.
- ((and dir-p helm-ff-auto-update-flag)
- (helm-ff-directory-files path t))
- (t (append (unless (or require-match
- ;; When `helm-ff-auto-update-flag' has been
- ;; disabled, whe don't want PATH to be added on top
- ;; if it is a directory.
- dir-p)
- (list path))
- (helm-ff-directory-files basedir t))))))
-
-(defun helm-ff-directory-files (directory &optional full)
- "List contents of DIRECTORY.
-Argument FULL mean absolute path.
-It is same as `directory-files' but always returns the
-dotted filename '.' and '..' even on root directories in Windows
-systems."
- (setq directory (file-name-as-directory
- (expand-file-name directory)))
- (let* (file-error
- (ls (condition-case err
- (directory-files
- directory full directory-files-no-dot-files-regexp)
- ;; Handle file-error from here for Windows
- ;; because predicates like `file-readable-p' and friends
- ;; seem broken on emacs for Windows systems (always returns t).
- ;; This should never be called on GNU/Linux/Unix
- ;; as the error is properly intercepted in
- ;; `helm-find-files-get-candidates' by `file-readable-p'.
- (file-error
- (prog1
- (list (format "%s:%s"
- (car err)
- (mapconcat 'identity (cdr err) " ")))
- (setq file-error t)))))
- (dot (concat directory "."))
- (dot2 (concat directory "..")))
- (append (and (not file-error) (list dot dot2)) ls)))
-
-(defun helm-ff-handle-backslash (fname)
- ;; Allow creation of filenames containing a backslash.
- (cl-loop with bad = '((92 . ""))
- for i across fname
- for isbad = (assq i bad)
- if isbad concat (cdr isbad)
- else concat (string i)))
-
-(defun helm-ff-fuzzy-matching-p ()
- (and helm-ff-fuzzy-matching
- (not (memq helm-mm-matching-method '(multi1 multi3p)))))
-
-(defun helm-ff--transform-pattern-for-completion (pattern)
- "Maybe return PATTERN with it's basename modified as a regexp.
-This happen only when `helm-ff-fuzzy-matching' is enabled.
-This provide a similar behavior as `ido-enable-flex-matching'.
-See also `helm--mapconcat-pattern'.
-If PATTERN is an url returns it unmodified.
-When PATTERN contain a space fallback to multi-match.
-If basename contain one or more space fallback to multi-match.
-If PATTERN is a valid directory name,return PATTERN unchanged."
- ;; handle bad filenames containing a backslash.
- (setq pattern (helm-ff-handle-backslash pattern))
- (let ((bn (helm-basename pattern))
- (bd (or (helm-basedir pattern) ""))
- (dir-p (file-directory-p pattern))
- (tramp-p (cl-loop for (m . f) in tramp-methods
- thereis (string-match m pattern))))
- ;; Always regexp-quote base directory name to handle
- ;; crap dirnames such e.g bookmark+
- (cond
- ((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
- ;; 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).
- ;; 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))
- (string-match "\\s-" bn)) ; Fall back to multi-match.
- (concat (regexp-quote bd) bn))
- ((or (string-match "[*][.]?.*" bn) ; Allow entering wilcard.
- (string-match "/$" pattern) ; Allow mkdir.
- (string-match helm-ff-url-regexp pattern)
- (and (string= helm-ff-default-directory "/") tramp-p))
- ;; Don't treat wildcards ("*") as regexp char.
- ;; (e.g ./foo/*.el => ./foo/[*].el)
- (concat (regexp-quote bd)
- (replace-regexp-in-string "[*]" "[*]" bn)))
- (t (concat (regexp-quote bd)
- (if (>= (length bn) 2) ; wait 2nd char before concating.
- (helm--mapconcat-pattern bn)
- (concat ".*" (regexp-quote bn))))))))
-
-(defun helm-dir-is-dot (dir)
- (string-match "\\(?:/\\|\\`\\)\\.\\{1,2\\}\\'" dir))
-
-(defun helm-ff-save-history ()
- "Store the last value of `helm-ff-default-directory' in `helm-ff-history'.
-Note that only existing directories are saved here."
- (when (and helm-ff-default-directory
- (helm-file-completion-source-p)
- (file-directory-p helm-ff-default-directory))
- (set-text-properties 0 (length helm-ff-default-directory)
- nil helm-ff-default-directory)
- (push helm-ff-default-directory helm-ff-history)))
-(add-hook 'helm-cleanup-hook 'helm-ff-save-history)
-
-(defun helm-files-save-file-name-history (&optional force)
- "Save selected file to `file-name-history'."
- (let ((src-name (assoc-default 'name (helm-get-current-source))))
- (when (or force (helm-file-completion-source-p)
- (member src-name helm-files-save-history-extra-sources))
- (let ((mkd (helm-marked-candidates))
- (history-delete-duplicates t))
- (cl-loop for sel in mkd
- when (and sel
- (stringp sel)
- (file-exists-p sel)
- (not (file-directory-p sel)))
- do
- ;; we use `abbreviate-file-name' here because
- ;; other parts of Emacs seems to,
- ;; and we don't want to introduce duplicates.
- (add-to-history 'file-name-history
- (abbreviate-file-name sel)))))))
-(add-hook 'helm-exit-minibuffer-hook 'helm-files-save-file-name-history)
-
-(defun helm-ff-valid-symlink-p (file)
- (helm-aif (condition-case-unless-debug nil
- ;; `file-truename' send error
- ;; on cyclic symlinks (Issue #692).
- (file-truename file)
- (error nil))
- (file-exists-p it)))
-
-(defun helm-get-default-mode-for-file (filename)
- "Return the default mode to open FILENAME."
- (let ((mode (cl-loop for (r . m) in auto-mode-alist
- thereis (and (string-match r filename) m))))
- (or (and (symbolp mode) mode) "Fundamental")))
-
-(defun helm-ff-properties (candidate)
- "Show file properties of CANDIDATE in a tooltip or message."
- (let* ((all (helm-file-attributes candidate))
- (dired-line (helm-file-attributes
- candidate :dired t :human-size t))
- (type (cl-getf all :type))
- (mode-type (cl-getf all :mode-type))
- (owner (cl-getf all :uid))
- (owner-right (cl-getf all :user t))
- (group (cl-getf all :gid))
- (group-right (cl-getf all :group))
- (other-right (cl-getf all :other))
- (size (helm-file-human-size (cl-getf all :size)))
- (modif (cl-getf all :modif-time))
- (access (cl-getf all :access-time))
- (ext (helm-get-default-program-for-file candidate))
- (tooltip-hide-delay (or helm-tooltip-hide-delay tooltip-hide-delay)))
- (if (and (window-system) tooltip-mode)
- (tooltip-show
- (concat
- (helm-basename candidate) "\n"
- dired-line "\n"
- (format "Mode: %s\n" (helm-get-default-mode-for-file candidate))
- (format "Ext prog: %s\n" (or (and ext (replace-regexp-in-string
- " %s" "" ext))
- "Not defined"))
- (format "Type: %s: %s\n" type mode-type)
- (when (string= type "symlink")
- (format "True name: '%s'\n"
- (cond ((string-match "^\.#" (helm-basename candidate))
- "Autosave symlink")
- ((helm-ff-valid-symlink-p candidate)
- (file-truename candidate))
- (t "Invalid Symlink"))))
- (format "Owner: %s: %s\n" owner owner-right)
- (format "Group: %s: %s\n" group group-right)
- (format "Others: %s\n" other-right)
- (format "Size: %s\n" size)
- (format "Modified: %s\n" modif)
- (format "Accessed: %s\n" access)))
- (message dired-line) (sit-for 5))))
-
-(defun helm-ff-properties-persistent ()
- "Show properties without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'properties-action '(helm-ff-properties . never-split))
- (helm-execute-persistent-action 'properties-action)))
-(put 'helm-ff-properties-persistent 'helm-only t)
-
-(defun helm-ff-persistent-delete ()
- "Delete current candidate without quitting."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'quick-delete '(helm-ff-quick-delete . never-split))
- (helm-execute-persistent-action 'quick-delete)))
-(put 'helm-ff-persistent-delete 'helm-only t)
-
-(defun helm-ff-dot-file-p (file)
- "Check if FILE is `.' or `..'."
- (member (helm-basename file) '("." "..")))
-
-(defun helm-ff-quick-delete (_candidate)
- "Delete file CANDIDATE without quitting."
- (let ((marked (helm-marked-candidates)))
- (unwind-protect
- (save-selected-window
- (cl-loop for c in marked do
- (progn (helm-preselect
- (if (and helm-ff-transformer-show-only-basename
- (not (helm-ff-dot-file-p c)))
- (helm-basename c) c))
- (when (y-or-n-p
- (format "Really Delete file `%s'? " c))
- (helm-delete-file
- c helm-ff-signal-error-on-dot-files 'synchro)
- (helm-delete-current-selection)
- (message nil)))))
- (with-helm-buffer
- (setq helm-marked-candidates nil
- helm-visible-mark-overlays nil))
- (helm-force-update
- (let ((presel (helm-get-selection)))
- (regexp-quote (if (and helm-ff-transformer-show-only-basename
- (not (helm-ff-dot-file-p presel)))
- (helm-basename presel) presel)))))))
-
-(defun helm-ff-kill-buffer-fname (candidate)
- (let* ((buf (get-file-buffer candidate))
- (buf-name (buffer-name buf)))
- (cond ((and buf (eq buf (get-buffer helm-current-buffer)))
- (user-error
- "Can't kill `helm-current-buffer' without quitting session"))
- (buf (kill-buffer buf) (message "Buffer `%s' killed" buf-name))
- (t (message "No buffer to kill")))))
-
-(defun helm-ff-kill-or-find-buffer-fname (candidate)
- "Find file CANDIDATE or kill it's buffer if it is visible.
-Never kill `helm-current-buffer'.
-Never kill buffer modified.
-This is called normally on third hit of \
-\\<helm-map>\\[helm-execute-persistent-action]
-in `helm-find-files-persistent-action'."
- (let* ((buf (get-file-buffer candidate))
- (buf-name (buffer-name buf))
- (win (get-buffer-window buf))
- (helm--reading-passwd-or-string t))
- (cond ((and buf win (eq buf (get-buffer helm-current-buffer)))
- (user-error
- "Can't kill `helm-current-buffer' without quitting session"))
- ((and buf win (buffer-modified-p buf))
- (message "Can't kill modified buffer, please save it before"))
- ((and buf win)
- (kill-buffer buf)
- (set-window-buffer win helm-current-buffer)
- (message "Buffer `%s' killed" buf-name))
- (t (find-file candidate)))))
-
-(defun helm-ff-run-kill-buffer-persistent ()
- "Execute `helm-ff-kill-buffer-fname' without quitting."
- (interactive)
- (with-helm-alive-p
- (helm-attrset '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)
-
-(defun helm-ff-prefix-filename (fname &optional file-or-symlinkp new-file)
- "Return filename FNAME maybe prefixed with [?] or [@].
-If FILE-OR-SYMLINKP is non--nil this mean we assume FNAME is an
-existing filename or valid symlink and there is no need to test it.
-NEW-FILE when non--nil mean FNAME is a non existing file and
-return FNAME prefixed with [?]."
- (let* ((prefix-new (propertize
- " " 'display
- (propertize "[?]" 'face 'helm-ff-prefix)))
- (prefix-url (propertize
- " " 'display
- (propertize "[@]" 'face 'helm-ff-prefix))))
- (cond (file-or-symlinkp fname)
- ((or (string-match helm-ff-url-regexp fname)
- (and ffap-url-regexp (string-match ffap-url-regexp fname)))
- (concat prefix-url " " fname))
- (new-file (concat prefix-new " " fname)))))
-
-(defun helm-ff-score-candidate-for-pattern (str pattern)
- (if (member str '("." ".."))
- 200
- (helm-score-candidate-for-pattern str pattern)))
-
-(defun helm-ff-sort-candidates (candidates _source)
- "Sort function for `helm-source-find-files'.
-Return candidates prefixed with basename of `helm-input' first."
- (if (or (and (file-directory-p helm-input)
- (string-match "/\\'" helm-input))
- (string-match "\\`\\$" helm-input)
- (null candidates))
- candidates
- (let* ((c1 (car candidates))
- (cand1real (if (consp c1) (cdr c1) c1))
- (cand1 (unless (file-exists-p cand1real) c1))
- (rest-cand (if cand1 (cdr candidates) candidates))
- (memo-src (make-hash-table :test 'equal))
- (all (sort rest-cand
- (lambda (s1 s2)
- (let* ((score (lambda (str)
- (helm-ff-score-candidate-for-pattern
- str (helm-basename helm-input))))
- (bn1 (helm-basename (if (consp s1) (cdr s1) s1)))
- (bn2 (helm-basename (if (consp s2) (cdr s2) s2)))
- (sc1 (or (gethash bn1 memo-src)
- (puthash bn1 (funcall score bn1) memo-src)))
- (sc2 (or (gethash bn2 memo-src)
- (puthash bn2 (funcall score bn2) memo-src))))
- (cond ((= sc1 sc2)
- (< (string-width bn1)
- (string-width bn2)))
- ((> sc1 sc2))))))))
- (if cand1 (cons cand1 all) all))))
-
-(defun helm-ff-filter-candidate-one-by-one (file)
- "`filter-one-by-one' Transformer function for `helm-source-find-files'."
- ;; Handle boring files
- (unless (and helm-ff-skip-boring-files
- (cl-loop for r in helm-boring-file-regexp-list
- ;; Prevent user doing silly thing like
- ;; adding the dotted files to boring regexps (#924).
- thereis (and (not (string-match "\\.$" file))
- (string-match r file))))
- ;; Handle tramp files.
- (if (and (string-match helm-tramp-file-name-regexp helm-pattern)
- helm-ff-tramp-not-fancy)
- (if helm-ff-transformer-show-only-basename
- (if (helm-dir-is-dot file)
- file
- (cons (or (helm-ff-get-host-from-tramp-invalid-fname file)
- (helm-basename file))
- file))
- file)
- ;; Now highlight.
- (let* ((disp (if (and helm-ff-transformer-show-only-basename
- (not (helm-dir-is-dot file))
- (not (and ffap-url-regexp
- (string-match ffap-url-regexp file)))
- (not (string-match helm-ff-url-regexp file)))
- (or (helm-ff-get-host-from-tramp-invalid-fname file)
- (helm-basename file)) file))
- (attr (file-attributes file))
- (type (car attr)))
-
- (cond ((string-match "file-error" file) file)
- ( ;; A not already saved file.
- (and (stringp type)
- (not (helm-ff-valid-symlink-p file))
- (not (string-match "^\.#" (helm-basename file))))
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-invalid-symlink) t)
- file))
- ;; A dotted directory symlinked.
- ((and (helm-ff-dot-file-p file) (stringp type))
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-dotted-symlink-directory) t)
- file))
- ;; A dotted directory.
- ((helm-ff-dot-file-p file)
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-dotted-directory) t)
- file))
- ;; A symlink.
- ((stringp type)
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-symlink) t)
- file))
- ;; A directory.
- ((eq t type)
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-directory) t)
- file))
- ;; An executable file.
- ((and attr (string-match "x" (nth 8 attr)))
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-executable) t)
- file))
- ;; A file.
- ((and attr (null type))
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-file) t)
- file))
- ;; A non--existing file.
- (t
- (cons (helm-ff-prefix-filename
- (propertize disp 'face 'helm-ff-file) nil 'new-file)
- file)))))))
-
-(defun helm-find-files-action-transformer (actions candidate)
- "Action transformer for `helm-source-find-files'."
- (let ((str-at-point (with-helm-current-buffer
- (buffer-substring-no-properties
- (point-at-bol) (point-at-eol)))))
- (cond ((with-helm-current-buffer
- (eq major-mode 'message-mode))
- (append actions
- '(("Gnus attach file(s)" . helm-ff-gnus-attach-files))))
- ((save-match-data
- (and ffap-url-regexp
- (not (string-match-p ffap-url-regexp str-at-point))
- (not (with-helm-current-buffer (eq major-mode 'dired-mode)))
- (string-match ":\\([0-9]+:?\\)" str-at-point)
- ))
- (append '(("Find file to line number" . helm-ff-goto-linum))
- actions))
- ((string-match (image-file-name-regexp) candidate)
- (append actions
- '(("Rotate image right `M-r'" . helm-ff-rotate-image-right)
- ("Rotate image left `M-l'" . helm-ff-rotate-image-left))))
- ((string-match "\.el$" (helm-aif (helm-marked-candidates)
- (car it) candidate))
- (append actions
- '(("Byte compile lisp file(s) `M-B, C-u to load'"
- . helm-find-files-byte-compile)
- ("Load File(s) `M-L'" . helm-find-files-load-files))))
- ((and (string-match "\.html?$" candidate)
- (file-exists-p candidate))
- (append actions
- '(("Browse url file" . browse-url-of-file))))
- ((or (string= (file-name-extension candidate) "pdf")
- (string= (file-name-extension candidate) "PDF"))
- (append actions
- '(("Pdfgrep File(s)" . helm-ff-pdfgrep))))
- (t actions))))
-
-(defun helm-ff-goto-linum (candidate)
- "Find file CANDIDATE and maybe jump to line number found in fname at point.
-line number should be added at end of fname preceded with \":\".
-e.g \"foo:12\"."
- (let ((linum (with-helm-current-buffer
- (let ((str (buffer-substring-no-properties
- (point-at-bol) (point-at-eol))))
- (when (string-match ":\\([0-9]+:?\\)" str)
- (match-string 1 str))))))
- (find-file candidate)
- (and linum (not (string= linum ""))
- (helm-goto-line (string-to-number linum) t))))
-
-(defun helm-ff-gnus-attach-files (_candidate)
- "Run `gnus-dired-attach' on `helm-marked-candidates' or CANDIDATE."
- (require 'gnus-dired)
- (let ((flist (helm-marked-candidates :with-wildcard t)))
- (gnus-dired-attach flist)))
-
-(defvar image-dired-display-image-buffer)
-(defun helm-ff-rotate-current-image-1 (file &optional num-arg)
- "Rotate current image at NUM-ARG degrees.
-This is a destructive operation on FILE made by external tool mogrify."
- (setq file (file-truename file)) ; For symlinked images.
- ;; When FILE is not an image-file, do nothing.
- (when (string-match (image-file-name-regexp) file)
- (if (executable-find "mogrify")
- (progn
- (shell-command (format "mogrify -rotate %s %s"
- (or num-arg 90)
- (shell-quote-argument file)))
- (when (buffer-live-p image-dired-display-image-buffer)
- (kill-buffer image-dired-display-image-buffer))
- (image-dired-display-image file)
- (message nil)
- (display-buffer (get-buffer image-dired-display-image-buffer)))
- (error "mogrify not found"))))
-
-(defun helm-ff-rotate-image-left (candidate)
- "Rotate image file CANDIDATE left.
-This affect directly file CANDIDATE."
- (helm-ff-rotate-current-image-1 candidate -90))
-
-(defun helm-ff-rotate-image-right (candidate)
- "Rotate image file CANDIDATE right.
-This affect directly file CANDIDATE."
- (helm-ff-rotate-current-image-1 candidate))
-
-(defun helm-ff-rotate-left-persistent ()
- "Rotate image left without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'image-action1 'helm-ff-rotate-image-left)
- (helm-execute-persistent-action 'image-action1)))
-(put 'helm-ff-rotate-left-persistent 'helm-only t)
-
-(defun helm-ff-rotate-right-persistent ()
- "Rotate image right without quitting helm."
- (interactive)
- (with-helm-alive-p
- (helm-attrset '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-exif-data (candidate)
- "Extract exif data from file CANDIDATE using `helm-ff-exif-data-program'."
- (if (and helm-ff-exif-data-program
- (executable-find helm-ff-exif-data-program))
- (shell-command-to-string (format "%s %s %s"
- helm-ff-exif-data-program
- helm-ff-exif-data-program-args
- candidate))
- (format "No program %s found to extract exif"
- helm-ff-exif-data-program)))
-
-(defun helm-find-files-persistent-action (candidate)
- "Open subtree CANDIDATE without quitting helm.
-If CANDIDATE is not a directory expand CANDIDATE filename.
-If CANDIDATE is alone, open file CANDIDATE filename.
-That's mean:
-First hit on C-j expand CANDIDATE second hit open file.
-If a prefix arg is given or `helm-follow-mode' is on open file."
- (let* ((follow (or (buffer-local-value
- 'helm-follow-mode
- (get-buffer-create helm-buffer))
- helm--temp-follow-flag))
- (new-pattern (helm-get-selection))
- (num-lines-buf (with-current-buffer helm-buffer
- (count-lines (point-min) (point-max))))
- (insert-in-minibuffer (lambda (fname)
- (with-selected-window (minibuffer-window)
- (unless follow
- (delete-minibuffer-contents)
- (set-text-properties 0 (length fname)
- nil fname)
- (insert fname))))))
- (cond ((and (helm-ff-invalid-tramp-name-p)
- (string-match helm-tramp-file-name-regexp candidate))
- ;; First hit insert hostname and
- ;; second hit insert ":" and expand.
- (if (string= candidate helm-pattern)
- (funcall insert-in-minibuffer (concat candidate ":"))
- (funcall insert-in-minibuffer candidate)))
- (;; A symlink directory, expand it but not to its truename
- ;; unless a prefix arg is given.
- (and (file-directory-p candidate) (file-symlink-p candidate))
- (funcall insert-in-minibuffer
- (file-name-as-directory
- (if current-prefix-arg
- (file-truename (expand-file-name candidate))
- (expand-file-name candidate)))))
- ;; A directory, open it.
- ((file-directory-p candidate)
- (when (string= (helm-basename candidate) "..")
- (setq helm-ff-last-expanded helm-ff-default-directory))
- (funcall insert-in-minibuffer (file-name-as-directory
- (expand-file-name candidate))))
- ;; A symlink file, expand to it's true name. (first hit)
- ((and (file-symlink-p candidate) (not current-prefix-arg) (not follow))
- (funcall insert-in-minibuffer (file-truename candidate)))
- ;; A regular file, expand it, (first hit)
- ((and (>= num-lines-buf 3) (not current-prefix-arg) (not follow))
- (setq helm-pattern "") ; Force update.
- (funcall insert-in-minibuffer new-pattern))
- ;; An image file and it is the second hit on C-j,
- ;; show the file in `image-dired'.
- ((string-match (image-file-name-regexp) candidate)
- (when (buffer-live-p (get-buffer image-dired-display-image-buffer))
- (kill-buffer image-dired-display-image-buffer))
- ;; Fix emacs bug never fixed upstream.
- (unless (file-directory-p image-dired-dir)
- (make-directory image-dired-dir))
- (image-dired-display-image candidate)
- (message nil)
- (switch-to-buffer image-dired-display-image-buffer)
- (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.
- ((and helm-ff-avfs-directory
- (string-match
- (regexp-quote (expand-file-name helm-ff-avfs-directory))
- (file-name-directory candidate))
- (helm-ff-file-compressed-p candidate))
- (funcall insert-in-minibuffer (concat candidate "#")))
- ;; On second hit we open file.
- ;; On Third hit we kill it's buffer maybe.
- (t
- (helm-ff-kill-or-find-buffer-fname candidate)))))
-
-(defun helm-ff-file-compressed-p (candidate)
- "Whether CANDIDATE is a compressed file or not."
- (member (file-name-extension candidate)
- helm-ff-file-compressed-list))
-
-(defun helm-insert-file-name-completion-at-point (candidate)
- "Insert file name completion at point."
- (with-helm-current-buffer
- (if buffer-read-only
- (error "Error: Buffer `%s' is read-only" (buffer-name))
- (let* ((end (point))
- (tap (thing-at-point 'filename))
- (guess (and (stringp tap) (substring-no-properties tap)))
- (beg (- (point) (length guess)))
- (full-path-p (and (stringp guess)
- (or (string-match-p
- (concat "^" (getenv "HOME"))
- guess)
- (string-match-p
- "\\`\\(/\\|[[:lower:][:upper:]]:/\\)"
- guess)))))
- (set-text-properties 0 (length candidate) nil candidate)
- (if (and guess (not (string= guess ""))
- (or (string-match "^\\(~/\\|/\\|[[:lower:][:upper:]]:/\\)"
- guess)
- (file-exists-p candidate)))
- (progn
- (delete-region beg end)
- (insert (cond (full-path-p
- (expand-file-name candidate))
- ((string= (match-string 1 guess) "~/")
- (abbreviate-file-name candidate))
- (t (file-relative-name candidate)))))
- (insert (cond ((equal helm-current-prefix-arg '(4))
- (abbreviate-file-name candidate))
- ((equal helm-current-prefix-arg '(16))
- (file-relative-name candidate))
- (t candidate))))))))
-
-(cl-defun helm-find-files-history (&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'."
- (let ((history (when helm-ff-history
- (helm-fast-remove-dups helm-ff-history
- :test 'equal))))
- (when history
- (setq helm-ff-history
- (if (>= (length history) helm-ff-history-max-length)
- (cl-subseq history 0 helm-ff-history-max-length)
- history))
- (if comp-read
- (helm-comp-read
- "Switch to Directory: "
- helm-ff-history
- :name "Helm Find Files History"
- :must-match t)
- helm-ff-history))))
-
-(defun helm-find-files-1 (fname &optional preselect)
- "Find FNAME with `helm' completion.
-Like `find-file' but with `helm' support.
-Use it for non--interactive calls of `helm-find-files'."
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (setq helm-find-files--toggle-bookmark nil)
- (let* ( ;; Be sure we don't erase the precedent minibuffer if some.
- (helm-ff-auto-update-initial-value
- (and helm-ff-auto-update-initial-value
- (not (minibuffer-window-active-p (minibuffer-window)))))
- (tap (thing-at-point 'filename))
- (def (and tap (or (file-remote-p tap)
- (expand-file-name tap)))))
- (unless helm-source-find-files
- (setq helm-source-find-files (helm-make-source
- "Find Files" 'helm-source-ffiles)))
- (unwind-protect
- (helm :sources 'helm-source-find-files
- :input fname
- :case-fold-search helm-file-name-case-fold-search
- :preselect preselect
- :ff-transformer-show-only-basename
- helm-ff-transformer-show-only-basename
- :default def
- :prompt "Find Files or Url: "
- :buffer "*Helm Find Files*")
- (setq helm-ff-default-directory nil))))
-
-(defun helm-find-files-toggle-to-bookmark ()
- "Toggle helm-bookmark for `helm-find-files' and `helm-find-files.'"
- (interactive)
- (with-helm-alive-p
- (with-helm-buffer
- (if (setq helm-find-files--toggle-bookmark
- (not helm-find-files--toggle-bookmark))
- (progn
- (helm-set-pattern "" t)
- (helm-set-sources '(helm-source-bookmark-helm-find-files)))
- ;; Switch back to helm-find-files.
- (helm-set-pattern "./" t) ; Back to initial directory of hff session.
- (helm-set-sources '(helm-source-find-files))
- (helm--maybe-update-keymap)))))
-(put 'helm-find-files-toggle-to-bookmark 'helm-only t)
-
-(defun helm-find-files-initial-input (&optional input)
- "Return INPUT if present, otherwise try to guess it."
- (let ((ffap-machine-p-known 'reject)
- (ffap-alist (and helm-ff-guess-ffap-filenames ffap-alist))
- (ffap-url-regexp (and helm-ff-guess-ffap-urls ffap-url-regexp)))
- (unless (eq major-mode 'image-mode)
- (or (and input (or (and (file-remote-p input) input)
- (expand-file-name input)))
- (helm-find-files-input
- (ffap-guesser)
- (thing-at-point 'filename))))))
-
-(defun helm-find-files-input (file-at-pt thing-at-pt)
- "Try to guess a default input for `helm-find-files'."
- (let* ((non-essential t)
- (remp (or (and file-at-pt (file-remote-p file-at-pt))
- (and thing-at-pt (file-remote-p thing-at-pt))))
- (def-dir (helm-current-directory))
- (urlp (and file-at-pt ffap-url-regexp
- (string-match ffap-url-regexp file-at-pt)))
- (lib (when helm-ff-search-library-in-sexp
- (helm-find-library-at-point)))
- (hlink (helm-ff-find-url-at-point))
- (file-p (and file-at-pt
- (not (string= file-at-pt ""))
- (not remp)
- (file-exists-p file-at-pt)
- thing-at-pt
- (not (string= thing-at-pt ""))
- (file-exists-p
- (file-name-directory
- (expand-file-name thing-at-pt def-dir))))))
- (cond (lib) ; e.g we are inside a require sexp.
- (hlink) ; String at point is an hyperlink.
- (file-p ; a regular file
- (helm-aif (ffap-file-at-point) (expand-file-name it)))
- (urlp file-at-pt) ; possibly an url or email.
- ((and file-at-pt
- (not remp)
- (file-exists-p file-at-pt))
- file-at-pt))))
-
-(defun helm-ff-find-url-at-point ()
- "Try to find link to an url in text-property at point."
- (let* ((he (get-text-property (point) 'help-echo))
- (ov (overlays-at (point)))
- (ov-he (and ov (overlay-get
- (car (overlays-at (point))) 'help-echo)))
- (w3m-l (get-text-property (point) 'w3m-href-anchor))
- (nt-prop (get-text-property (point) 'nt-link)))
- ;; Org link.
- (when (and (stringp he) (string-match "^LINK: " he))
- (setq he (replace-match "" t t he)))
- (cl-loop for i in (list he ov-he w3m-l nt-prop)
- thereis (and (stringp i) ffap-url-regexp (string-match ffap-url-regexp i) i))))
-
-(defun helm-find-library-at-point ()
- "Try to find library path at point.
-Find inside `require' and `declare-function' sexp."
- (require 'find-func)
- (let* ((beg-sexp (save-excursion (search-backward "(" (point-at-bol) t)))
- (end-sexp (save-excursion (search-forward ")" (point-at-eol) t)))
- (sexp (and beg-sexp end-sexp
- (buffer-substring-no-properties
- (1+ beg-sexp) (1- end-sexp)))))
- (ignore-errors
- (cond ((and sexp (string-match "require \'.+[^)]" sexp))
- (find-library-name
- (replace-regexp-in-string
- "'\\|\)\\|\(" ""
- ;; If require use third arg, ignore it,
- ;; always use library path found in `load-path'.
- (cl-second (split-string (match-string 0 sexp))))))
- ((and sexp (string-match-p "^declare-function" sexp))
- (find-library-name
- (replace-regexp-in-string
- "\"\\|ext:" ""
- (cl-third (split-string sexp)))))
- (t nil)))))
-
-\f
-;;; Handle copy, rename, symlink, relsymlink and hardlink from helm.
-;;
-;;
-(defun helm-ff--valid-default-directory ()
- (with-helm-current-buffer
- (cl-loop for b in (buffer-list)
- for cd = (with-current-buffer b default-directory)
- when (eq (car (file-attributes cd)) t)
- return cd)))
-
-(defvar dired-async-mode)
-(cl-defun helm-dired-action (candidate
- &key action follow (files (dired-get-marked-files)))
- "Execute ACTION on FILES to CANDIDATE.
-Where ACTION is a symbol that can be one of:
-'copy, 'rename, 'symlink,'relsymlink, 'hardlink.
-Argument FOLLOW when non--nil specify to follow FILES to destination for the actions
-copy and rename."
- (when (get-buffer dired-log-buffer) (kill-buffer dired-log-buffer))
- ;; When default-directory in current-buffer is an invalid directory,
- ;; (e.g buffer-file directory have been renamed somewhere else)
- ;; be sure to use a valid value to give to dired-create-file.
- ;; i.e start-process is creating a process buffer based on default-directory.
- (let ((default-directory (helm-ff--valid-default-directory))
- (fn (cl-case action
- (copy 'dired-copy-file)
- (rename 'dired-rename-file)
- (symlink 'make-symbolic-link)
- (relsymlink 'dired-make-relative-symlink)
- (hardlink 'dired-hardlink)))
- (marker (cl-case action
- ((copy rename) dired-keep-marker-copy)
- (symlink dired-keep-marker-symlink)
- (relsymlink dired-keep-marker-relsymlink)
- (hardlink dired-keep-marker-hardlink)))
- (dirflag (and (= (length files) 1)
- (file-directory-p (car files))
- (not (file-directory-p candidate))))
- (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))
- (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.
- (lambda (from)
- (expand-file-name (file-name-nondirectory from) candidate))
- (lambda (_from) candidate))
- 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)))
- 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)))
- (unwind-protect
- (progn
- (setq helm-ff-cand-to-mark
- (helm-get-dest-fnames-from-list files candidate dirflag))
- (with-helm-after-update-hook (helm-ff-maybe-mark-candidates))
- (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)))))
- (setq helm-ff-cand-to-mark nil))))))
-
-(defun helm-get-dest-fnames-from-list (flist dest-cand rename-dir-flag)
- "Transform filenames of FLIST to abs of DEST-CAND.
-If RENAME-DIR-FLAG is non--nil collect the `directory-file-name' of transformed
-members of FLIST."
- ;; At this point files have been renamed/copied at destination.
- ;; That's mean DEST-CAND exists.
- (cl-loop
- with dest = (expand-file-name dest-cand)
- for src in flist
- for basename-src = (helm-basename src)
- for fname = (cond (rename-dir-flag (directory-file-name dest))
- ((file-directory-p dest)
- (concat (file-name-as-directory dest) basename-src))
- (t dest))
- when (file-exists-p fname)
- collect fname into tmp-list
- finally return (sort tmp-list 'string<)))
-
-(defun helm-ff-maybe-mark-candidates ()
- "Mark all candidates of list `helm-ff-cand-to-mark'.
-This is used when copying/renaming/symlinking etc... and
-following files to destination."
- (when (and (string= (assoc-default 'name (helm-get-current-source))
- (assoc-default 'name helm-source-find-files))
- helm-ff-cand-to-mark)
- (with-helm-window
- (while helm-ff-cand-to-mark
- (if (string= (car helm-ff-cand-to-mark) (helm-get-selection))
- (progn
- (helm-make-visible-mark)
- (helm-next-line)
- (setq helm-ff-cand-to-mark (cdr helm-ff-cand-to-mark)))
- (helm-next-line)))
- (unless (helm-this-visible-mark)
- (helm-prev-visible-mark)))))
-
-\f
-;;; Routines for files
-;;
-;;
-(defun helm-file-buffers (filename)
- "Returns a list of buffer names corresponding to FILENAME."
- (cl-loop with name = (expand-file-name filename)
- for buf in (buffer-list)
- for bfn = (buffer-file-name buf)
- when (and bfn (string= name bfn))
- collect (buffer-name buf)))
-
-(defun helm-delete-file (file &optional error-if-dot-file-p synchro)
- "Delete the given file after querying the user.
-Ask to kill buffers associated with that file, too."
- (when (and error-if-dot-file-p
- (helm-ff-dot-file-p file))
- (error "Error: Cannot operate on `.' or `..'"))
- (let ((buffers (helm-file-buffers file))
- (helm--reading-passwd-or-string t))
- (if (or (< emacs-major-version 24) synchro)
- ;; `dired-delete-file' in Emacs versions < 24
- ;; doesn't support delete-by-moving-to-trash
- ;; so use `delete-directory' and `delete-file'
- ;; that handle it.
- (cond ((and (not (file-symlink-p file))
- (file-directory-p file)
- (directory-files file t dired-re-no-dot))
- (when (y-or-n-p (format "Recursive delete of `%s'? " file))
- (delete-directory file 'recursive)))
- ((and (not (file-symlink-p file))
- (file-directory-p file))
- (delete-directory file))
- (t (delete-file file)))
- (dired-delete-file
- file dired-recursive-deletes delete-by-moving-to-trash))
- (when buffers
- (cl-dolist (buf buffers)
- (when (y-or-n-p (format "Kill buffer %s, too? " buf))
- (kill-buffer buf))))))
-
-(defun helm-delete-marked-files (_ignore)
- (let* ((files (helm-marked-candidates :with-wildcard t))
- (len (length files)))
- (with-helm-display-marked-candidates
- helm-marked-buffer-name
- (mapcar (lambda (f)
- (if (file-directory-p f)
- (concat (helm-basename f) "/")
- (helm-basename f)))
- files)
- (if (not (y-or-n-p (format "Delete *%s File(s)" len)))
- (message "(No deletions performed)")
- (cl-dolist (i files)
- (set-text-properties 0 (length i) nil i)
- (helm-delete-file i helm-ff-signal-error-on-dot-files))
- (message "%s File(s) deleted" len)))))
-
-(defun helm-find-file-or-marked (candidate)
- "Open file CANDIDATE or open helm marked files in separate windows.
-Called with a prefix arg open files in background without selecting them."
- (let ((marked (helm-marked-candidates :with-wildcard t))
- (url-p (and ffap-url-regexp ; we should have only one candidate.
- (string-match ffap-url-regexp candidate)))
- (ffap-newfile-prompt helm-ff-newfile-prompt-p)
- (find-file-wildcards nil)
- (make-dir-fn
- (lambda (dir &optional helm-ff)
- (when (or (not confirm-nonexistent-file-or-buffer)
- (y-or-n-p (format "Create directory `%s'? " dir)))
- (let ((dirfname (directory-file-name dir)))
- (if (file-exists-p dirfname)
- (error
- "Mkdir: Unable to create directory `%s': file exists."
- (helm-basename dirfname))
- (make-directory dir 'parent)))
- (when helm-ff
- ;; Allow having this new dir in history
- ;; to be able to retrieve it immediately
- ;; if we want to e.g copy a file from somewhere in it.
- (setq helm-ff-default-directory
- (file-name-as-directory dir))
- (push helm-ff-default-directory helm-ff-history))
- (or (and helm-ff (helm-find-files-1 dir)) t))))
- (helm--reading-passwd-or-string t))
- (if (cdr marked)
- (if helm-current-prefix-arg
- (dired-simultaneous-find-file marked nil)
- (mapc 'find-file-noselect (cdr marked))
- (find-file (car marked)))
- (if (and (not (file-exists-p candidate))
- (not url-p)
- (string-match "/$" candidate))
- ;; A a non--existing filename ending with /
- ;; Create a directory and jump to it.
- (funcall make-dir-fn candidate 'helm-ff)
- ;; A non--existing filename NOT ending with / or
- ;; an existing filename, create or jump to it.
- ;; If the basedir of candidate doesn't exists,
- ;; ask for creating it.
- (let ((dir (and (not url-p) (helm-basedir candidate))))
- (find-file-at-point
- (cond ((and dir (file-directory-p dir))
- (substitute-in-file-name candidate))
- (url-p candidate)
- ((funcall make-dir-fn dir) candidate))))))))
-
-(defun helm-shadow-boring-files (files)
- "Files matching `helm-boring-file-regexp' will be
-displayed with the `file-name-shadow' face if available."
- (helm-shadow-entries files helm-boring-file-regexp-list))
-
-(defun helm-skip-boring-files (files)
- "Files matching `helm-boring-file-regexp' will be skipped."
- (helm-skip-entries files helm-boring-file-regexp-list))
-
-(defun helm-skip-current-file (files)
- "Current file will be skipped."
- (remove (buffer-file-name helm-current-buffer) files))
-
-(defun helm-w32-pathname-transformer (args)
- "Change undesirable features of windows pathnames to ones more acceptable to
-other candidate transformers."
- (if (eq system-type 'windows-nt)
- (helm-transform-mapcar
- (lambda (x)
- (replace-regexp-in-string
- "/cygdrive/\\(.\\)" "\\1:"
- (replace-regexp-in-string "\\\\" "/" x)))
- args)
- args))
-
-(defun helm-transform-file-load-el (actions candidate)
- "Add action to load the file CANDIDATE if it is an emacs lisp
-file. Else return ACTIONS unmodified."
- (if (member (file-name-extension candidate) '("el" "elc"))
- (append actions '(("Load Emacs Lisp File" . load-file)))
- actions))
-
-(defun helm-transform-file-browse-url (actions candidate)
- "Add an action to browse the file CANDIDATE if it is a html file or URL.
-Else return ACTIONS unmodified."
- (let ((browse-action '("Browse with Browser" . browse-url)))
- (cond ((string-match "^http\\|^ftp" candidate)
- (cons browse-action actions))
- ((string-match "\\.html?$" candidate)
- (append actions (list browse-action)))
- (t actions))))
-
-(defun helm-multi-files-toggle-to-locate ()
- (interactive)
- (with-helm-alive-p
- (with-helm-buffer
- (if (setq helm-multi-files--toggle-locate
- (not helm-multi-files--toggle-locate))
- (progn
- (helm-set-sources (unless (memq 'helm-source-locate
- helm-sources)
- (cons 'helm-source-locate helm-sources)))
- (helm-set-source-filter '(helm-source-locate)))
- (helm-kill-async-processes)
- (helm-set-sources (remove 'helm-source-locate
- helm-for-files-preferred-list))
- (helm-set-source-filter nil)))))
-(put 'helm-multi-files-toggle-to-locate 'helm-only t)
-
-\f
-;;; List of files gleaned from every dired buffer
-;;
-;;
-(defun helm-files-in-all-dired-candidates ()
- (save-excursion
- (cl-loop for (f . b) in dired-buffers
- 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))))))
-
-;; (dired '("~/" "~/.emacs.d/.emacs-custom.el" "~/.emacs.d/.emacs.bmk"))
-
-(defclass helm-files-dired-source (helm-source-sync helm-type-file)
- ((candidates :initform #'helm-files-in-all-dired-candidates)))
-
-(defvar helm-source-files-in-all-dired
- (helm-make-source "Files in all dired buffer." 'helm-files-dired-source))
-
-\f
-;;; File Cache
-;;
-;;
-(defvar file-cache-alist)
-
-(defclass helm-file-cache (helm-source-in-buffer helm-type-file)
- ((init :initform (lambda () (require 'filecache)))))
-
-(defun helm-file-cache-get-candidates ()
- (cl-loop for item in file-cache-alist append
- (cl-destructuring-bind (base &rest dirs) item
- (cl-loop for dir in dirs collect
- (concat dir base)))))
-
-(defvar helm-source-file-cache nil)
-
-(defcustom helm-file-cache-fuzzy-match nil
- "Enable fuzzy matching in `helm-source-file-cache' when non--nil."
- :group 'helm-files
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-file-cache
- (helm-make-source "File Cache" 'helm-file-cache
- :fuzzy-match helm-file-cache-fuzzy-match
- :data 'helm-file-cache-get-candidates))))
-
-(cl-defun helm-file-cache-add-directory-recursively
- (dir &optional match (ignore-dirs t))
- (require 'filecache)
- (cl-loop for f in (helm-walk-directory
- dir
- :path 'full
- :directories nil
- :match match
- :skip-subdirs ignore-dirs)
- do (file-cache-add-file f)))
-
-(defun helm-ff-cache-add-file (_candidate)
- (require 'filecache)
- (let ((mkd (helm-marked-candidates :with-wildcard t)))
- (mapc 'file-cache-add-file mkd)))
-
-(defun helm-ff-file-cache-remove-file-1 (file)
- "Remove FILE from `file-cache-alist'."
- (let ((entry (assoc (helm-basename file) file-cache-alist))
- (dir (helm-basedir file))
- new-entry)
- (setq new-entry (remove dir entry))
- (when (= (length entry) 1)
- (setq new-entry nil))
- (setq file-cache-alist
- (cons new-entry (remove entry file-cache-alist)))))
-
-(defun helm-ff-file-cache-remove-file (_file)
- "Remove marked files from `file-cache-alist.'"
- (let ((mkd (helm-marked-candidates)))
- (mapc 'helm-ff-file-cache-remove-file-1 mkd)))
-
-(defun helm-transform-file-cache (actions _candidate)
- (let ((source (helm-get-current-source)))
- (if (string= (assoc-default 'name source) "File Cache")
- (append actions
- '(("Remove marked files from file-cache"
- . helm-ff-file-cache-remove-file)))
- actions)))
-
-\f
-;;; File name history
-;;
-;;
-(defvar helm-source-file-name-history
- (helm-build-sync-source "File Name History"
- :candidates 'file-name-history
- :persistent-action #'ignore
- :filtered-candidate-transformer #'helm-file-name-history-transformer
- :action 'helm-type-file-actions))
-
-(defvar helm-source--ff-file-name-history nil
- "[Internal] This source is build to be used with `helm-find-files'.
-Don't use it in your own code unless you know what you are doing.")
-
-(defun helm-file-name-history-transformer (candidates _source)
- (cl-loop for c in candidates collect
- (cond ((file-remote-p c)
- (cons (propertize c 'face 'helm-history-remote) c))
- ((file-exists-p c)
- (cons (propertize c 'face 'helm-ff-file) c))
- (t (cons (propertize c 'face 'helm-history-deleted) c)))))
-
-(defun helm-ff-file-name-history ()
- "Switch to `file-name-history' without quitting `helm-find-files'."
- (interactive)
- (unless helm-source--ff-file-name-history
- (setq helm-source--ff-file-name-history
- (helm-build-sync-source "File name history"
- :init (lambda ()
- (with-helm-alive-p
- (when helm-ff-file-name-history-use-recentf
- (require 'recentf)
- (or recentf-mode (recentf-mode 1)))))
- :candidates (lambda ()
- (if helm-ff-file-name-history-use-recentf
- recentf-list
- file-name-history))
- :fuzzy-match t
- :persistent-action 'ignore
- :migemo t
- :filtered-candidate-transformer 'helm-file-name-history-transformer
- :action (helm-make-actions
- "Find file" (lambda (candidate)
- (helm-set-pattern
- (expand-file-name candidate))
- (with-helm-after-update-hook (helm-exit-minibuffer)))
- "Find file in helm" (lambda (candidate)
- (helm-set-pattern
- (expand-file-name candidate)))))))
- (with-helm-alive-p
- (helm :sources 'helm-source--ff-file-name-history
- :buffer "*helm-file-name-history*"
- :allow-nest t
- :resume 'noresume)))
-(put 'helm-ff-file-name-history 'helm-only t)
-
-;;; Recentf files
-;;
-;;
-(defvar helm-recentf--basename-flag nil)
-
-(defun helm-recentf-pattern-transformer (pattern)
- (let ((pattern-no-flag (replace-regexp-in-string " -b" "" pattern)))
- (cond ((and (string-match " " pattern-no-flag)
- (string-match " -b\\'" pattern))
- (setq helm-recentf--basename-flag t)
- pattern-no-flag)
- ((string-match "\\([^ ]*\\) -b\\'" pattern)
- (prog1 (match-string 1 pattern)
- (setq helm-recentf--basename-flag t)))
- (t (setq helm-recentf--basename-flag nil)
- pattern))))
-
-(defclass helm-recentf-source (helm-source-sync helm-type-file)
- ((init :initform (lambda ()
- (require 'recentf)
- (recentf-mode 1)))
- (candidates :initform (lambda () recentf-list))
- (pattern-transformer :initform 'helm-recentf-pattern-transformer)
- (match-part :initform (lambda (candidate)
- (if (or helm-ff-transformer-show-only-basename
- helm-recentf--basename-flag)
- (helm-basename candidate) candidate)))
- (migemo :initform t)
- (persistent-action :initform 'helm-ff-kill-or-find-buffer-fname)))
-
-(defmethod helm--setup-source :after ((source helm-recentf-source))
- (set-slot-value
- source 'action
- (append (symbol-value (helm-actions-from-type-file))
- '(("Delete file(s) from recentf" .
- (lambda (_candidate)
- (cl-loop for file in (helm-marked-candidates)
- do (setq recentf-list (delq file recentf-list)))))))))
-
-(defvar helm-source-recentf nil
- "See (info \"(emacs)File Conveniences\").
-Set `recentf-max-saved-items' to a bigger value if default is too small.")
-
-(defcustom helm-recentf-fuzzy-match nil
- "Enable fuzzy matching in `helm-source-recentf' when non--nil."
- :group 'helm-files
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-recentf
- (helm-make-source "Recentf" 'helm-recentf-source
- :fuzzy-match helm-recentf-fuzzy-match))))
-
-;;; Browse project
-;; Need dependencies:
-;; <https://github.com/emacs-helm/helm-ls-git>
-;; <https://github.com/emacs-helm/helm-ls-hg>
-;; Only hg and git are supported for now.
-(defvar helm--browse-project-cache (make-hash-table :test 'equal))
-
-(defun helm-browse-project-get-buffers (root-directory)
- (cl-loop for b in (helm-buffer-list)
- ;; FIXME: Why default-directory is root-directory
- ;; for current-buffer when coming from helm-quit-and-find-file.
- for cd = (with-current-buffer b default-directory)
- for bn = (buffer-file-name (get-buffer b))
- if (or (and bn (file-in-directory-p bn root-directory))
- (and (null bn)
- (file-in-directory-p cd root-directory)))
- collect b))
-
-(defun helm-browse-project-build-buffers-source (directory)
- (helm-make-source "Buffers in project" 'helm-source-buffers
- :header-name (lambda (name)
- (format
- "%s (%s)"
- name (abbreviate-file-name directory)))
- :buffer-list (lambda () (helm-browse-project-get-buffers directory))))
-
-(defun helm-browse-project-find-files (directory &optional refresh)
- (when refresh (remhash directory helm--browse-project-cache))
- (unless (gethash directory helm--browse-project-cache)
- (puthash directory (helm-walk-directory
- directory
- :directories nil :path 'full :skip-subdirs t)
- helm--browse-project-cache))
- (helm :sources `(,(helm-browse-project-build-buffers-source directory)
- ,(helm-build-in-buffer-source "Browse project"
- :data (gethash directory helm--browse-project-cache)
- :header-name (lambda (name)
- (format
- "%s (%s)"
- name (abbreviate-file-name directory)))
- :match-part (lambda (c)
- (if helm-ff-transformer-show-only-basename
- (helm-basename c) c))
- :filter-one-by-one
- (lambda (c)
- (if helm-ff-transformer-show-only-basename
- (cons (propertize (helm-basename c)
- 'face 'helm-ff-file)
- c)
- (propertize c 'face 'helm-ff-file)))
- :keymap helm-generic-files-map
- :action 'helm-type-file-actions))
- :buffer "*helm browse project*"))
-
-;;;###autoload
-(defun 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>
-and
-<http://melpa.org/#/helm-ls-svn>."
- (interactive "P")
- (cond ((and (require 'helm-ls-git nil t)
- (fboundp 'helm-ls-git-root-dir)
- (helm-ls-git-root-dir))
- (helm-ls-git-ls))
- ((and (require 'helm-ls-hg nil t)
- (fboundp 'helm-hg-root)
- (helm-hg-root))
- (helm-hg-find-files-in-project))
- ((and (require 'helm-ls-svn nil t)
- (fboundp 'helm-ls-svn-root-dir)
- (helm-ls-svn-root-dir))
- (helm-ls-svn-ls))
- (t (let ((cur-dir (helm-browse-project-get--root-dir
- (helm-current-directory))))
- (if (or arg (gethash cur-dir helm--browse-project-cache))
- (helm-browse-project-find-files cur-dir (equal arg '(16)))
- (helm :sources (helm-browse-project-build-buffers-source cur-dir)
- :buffer "*helm browse project*"))))))
-
-(defun helm-browse-project-get--root-dir (directory)
- (cl-loop with dname = (file-name-as-directory directory)
- while (and dname (not (gethash dname helm--browse-project-cache)))
- if (file-remote-p dname)
- do (setq dname nil) else
- do (setq dname (helm-basedir (substring dname 0 (1- (length dname)))))
- finally return (or dname (file-name-as-directory directory))))
-
-(defun helm-ff-browse-project (_candidate)
- "Browse project in current directory.
-See `helm-browse-project'."
- (with-helm-default-directory helm-ff-default-directory
- (helm-browse-project helm-current-prefix-arg)))
-
-(defun helm-ff-run-browse-project ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-browse-project)))
-(put 'helm-ff-run-browse-project 'helm-only t)
-
-(defun helm-ff-gid (_candidate)
- (with-helm-default-directory helm-ff-default-directory
- (helm-gid)))
-
-(defun helm-ff-run-gid ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-gid)))
-(put 'helm-ff-run-gid 'helm-only t)
-
-;;; session.el files
-;;
-;; session (http://emacs-session.sourceforge.net/) is an alternative to
-;; recentf that saves recent file history and much more.
-(defvar session-file-alist)
-(defvar helm-source-session
- (helm-build-sync-source "Session"
- :candidates (lambda ()
- (cl-delete-if-not (lambda (f)
- (or (string-match helm-tramp-file-name-regexp f)
- (file-exists-p f)))
- (mapcar 'car session-file-alist)))
- :keymap helm-generic-files-map
- :help-message helm-generic-file-help-message
- :action 'helm-type-file-actions)
- "File list from emacs-session.")
-
-\f
-;;; Files in current dir
-;;
-;;
-(defun helm-highlight-files (files)
- "A basic transformer for helm files sources.
-Colorize only symlinks, directories and files."
- (cl-loop for i in files
- for disp = (if (and helm-ff-transformer-show-only-basename
- (not (helm-dir-is-dot i))
- (not (and ffap-url-regexp
- (string-match ffap-url-regexp i)))
- (not (string-match helm-ff-url-regexp i)))
- (helm-basename i) i)
- for type = (and (null helm-ff-tramp-not-fancy)
- (car (file-attributes i)))
- collect
- (cond ((and helm-ff-tramp-not-fancy
- (string-match helm-tramp-file-name-regexp i))
- (cons disp i))
- ((stringp type)
- (cons (propertize disp
- 'face 'helm-ff-symlink
- 'help-echo (expand-file-name i))
- i))
- ((eq type t)
- (cons (propertize disp
- 'face 'helm-ff-directory
- 'help-echo (expand-file-name i))
- i))
- (t (cons (propertize disp
- 'face 'helm-ff-file
- 'help-echo (expand-file-name i))
- i)))))
-
-(defclass helm-files-in-current-dir-source (helm-source-sync helm-type-file)
- ((candidates :initform (lambda ()
- (with-helm-current-buffer
- (let ((dir (helm-current-directory)))
- (when (file-accessible-directory-p dir)
- (directory-files dir t))))))
- (pattern-transformer :initform 'helm-recentf-pattern-transformer)
- (match-part :initform (lambda (candidate)
- (if (or helm-ff-transformer-show-only-basename
- helm-recentf--basename-flag)
- (helm-basename candidate) candidate)))
- (fuzzy-match :initform t)
- (migemo :initform t)))
-
-(defvar helm-source-files-in-current-dir
- (helm-make-source "Files from Current Directory"
- helm-files-in-current-dir-source))
-
-\f
-;;; External searching file tools.
-;;
-;; Tracker desktop search
-(defvar helm-source-tracker-cand-incomplete nil "Contains incomplete candidate")
-(defun helm-source-tracker-transformer (candidates _source)
- (helm-log "received: %S" candidates)
- (cl-loop for cand in candidates
- for path = (when (stringp helm-source-tracker-cand-incomplete)
- (caar (helm-highlight-files
- (list helm-source-tracker-cand-incomplete))))
- for built = (if (not (stringp cand)) cand
- (let ((snippet cand))
- (unless (or (null path)
- (string= "" path)
- (not (string-match-p
- "\\`[[:space:]]*\\.\\.\\."
- snippet)))
- (let ((complete-candidate
- (cons (concat path "\n" snippet) path)))
- (setq helm-source-tracker-cand-incomplete nil)
- (helm-log "built: %S" complete-candidate)
- complete-candidate))))
- when (and (stringp cand)
- (string-match "\\`[[:space:]]*file://" cand))
- do (setq helm-source-tracker-cand-incomplete ; save path
- (replace-match "" t t cand)) end
- collect built))
-
-(defvar helm-source-tracker-search
- (helm-build-async-source "Tracker Search"
- :candidates-process
- (lambda ()
- (start-process "tracker-search-process" nil
- "tracker-search"
- "--disable-color"
- "--limit=512"
- helm-pattern))
- :filtered-candidate-transformer #'helm-source-tracker-transformer
- ;;(multiline) ; https://github.com/emacs-helm/helm/issues/529
- :keymap helm-generic-files-map
- :action 'helm-type-file-actions
- :action-transformer '(helm-transform-file-load-el
- helm-transform-file-browse-url)
- :requires-pattern 3)
- "Source for retrieving files matching the current input pattern
-with the tracker desktop search.")
-
-;; Spotlight (MacOS X desktop search)
-(defclass helm-mac-spotlight-source (helm-source-async helm-type-file)
- ((candidates-process :initform
- (lambda ()
- (start-process
- "mdfind-process" nil "mdfind" helm-pattern)))
- (requires-pattern :initform 3)))
-
-(defvar helm-source-mac-spotlight
- (helm-make-source "mdfind" helm-mac-spotlight-source)
- "Source for retrieving files via Spotlight's command line
-utility mdfind.")
-
-\f
-;;; Findutils
-;;
-;;
-(defvar helm-source-findutils
- (helm-build-async-source "Find"
- :header-name (lambda (name)
- (concat name " in [" (helm-default-directory) "]"))
- :candidates-process 'helm-find-shell-command-fn
- :filtered-candidate-transformer 'helm-findutils-transformer
- :action-transformer 'helm-transform-file-load-el
- :persistent-action 'helm-ff-kill-or-find-buffer-fname
- :action 'helm-type-file-actions
- :keymap helm-generic-files-map
- :candidate-number-limit 9999
- :requires-pattern 3))
-
-(defun helm-findutils-transformer (candidates _source)
- (let (non-essential
- (default-directory (helm-default-directory)))
- (cl-loop for i in candidates
- for abs = (expand-file-name
- (helm-aif (file-remote-p default-directory)
- (concat it i) i))
- for type = (car (file-attributes abs))
- for disp = (if (and helm-ff-transformer-show-only-basename
- (not (string-match "[.]\\{1,2\\}$" i)))
- (helm-basename abs) abs)
- collect (cond ((eq t type)
- (cons (propertize disp 'face 'helm-ff-directory)
- abs))
- ((stringp type)
- (cons (propertize disp 'face 'helm-ff-symlink)
- abs))
- (t (cons (propertize disp 'face 'helm-ff-file)
- abs))))))
-
-(defun helm-find--build-cmd-line ()
- (require 'find-cmd)
- (let* ((default-directory (or (file-remote-p default-directory 'localname)
- default-directory))
- (patterns+options (split-string helm-pattern "\\(\\`\\| +\\)\\* +"))
- (fold-case (helm-set-case-fold-search (car patterns+options)))
- (patterns (split-string (car patterns+options)))
- (additional-options (and (cdr patterns+options)
- (list (concat (cadr patterns+options) " "))))
- (ignored-dirs ())
- (ignored-files (when helm-findutils-skip-boring-files
- (cl-loop for f in completion-ignored-extensions
- if (string-match "/$" f)
- do (push (replace-match "" nil t f)
- ignored-dirs)
- else collect (concat "*" f))))
- (path-or-name (if helm-findutils-search-full-path
- '(ipath path) '(iname name)))
- (name-or-iname (if fold-case
- (car path-or-name) (cadr path-or-name))))
- (find-cmd (and ignored-dirs
- `(prune (name ,@ignored-dirs)))
- (and ignored-files
- `(not (name ,@ignored-files)))
- `(and ,@(mapcar
- (lambda (pattern)
- `(,name-or-iname ,(concat "*" pattern "*")))
- patterns)
- ,@additional-options))))
-
-(defun helm-find-shell-command-fn ()
- "Asynchronously fetch candidates for `helm-find'.
-Additional find options can be specified after a \"*\"
-separator."
- (let* (process-connection-type
- non-essential
- (cmd (helm-find--build-cmd-line))
- (proc (start-file-process-shell-command "hfind" helm-buffer cmd)))
- (helm-log "Find command:\n%s" cmd)
- (prog1 proc
- (set-process-sentinel
- proc
- (lambda (process event)
- (helm-process-deferred-sentinel-hook
- process event (helm-default-directory))
- (if (string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format "[Find process finished - (%s results)]"
- (max (1- (count-lines
- (point-min) (point-max)))
- 0))
- 'face 'helm-locate-finish))))
- (force-mode-line-update))
- (helm-log "Error: Find %s"
- (replace-regexp-in-string "\n" "" event))))))))
-
-(defun helm-find-1 (dir)
- (let ((default-directory (file-name-as-directory dir)))
- (helm :sources 'helm-source-findutils
- :buffer "*helm find*"
- :ff-transformer-show-only-basename nil
- :case-fold-search helm-file-name-case-fold-search)))
-
-;; helm-find-files integration.
-(defun helm-ff-find-sh-command (_candidate)
- "Run `helm-find' from `helm-find-files'."
- (helm-find-1 helm-ff-default-directory))
-
-(defun helm-ff-run-find-sh-command ()
- "Run find shell command action with key from `helm-find-files'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-ff-find-sh-command)))
-(put 'helm-ff-run-find-sh-command 'helm-only t)
-
-\f
-;;; Preconfigured commands
-;;
-;;
-;;;###autoload
-(defun helm-find (arg)
- "Preconfigured `helm' for the find shell command."
- (interactive "P")
- (let ((directory
- (if arg
- (file-name-as-directory
- (read-directory-name "DefaultDirectory: "))
- default-directory)))
- (helm-find-1 directory)))
-
-(defvar org-directory)
-;;;###autoload
-(defun 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."
- (interactive "P")
- (let* ((hist (and arg helm-ff-history (helm-find-files-history)))
- (default-input (or hist (helm-find-files-initial-input)))
- (input (cond ((and (eq major-mode 'org-agenda-mode)
- org-directory
- (not default-input))
- (expand-file-name org-directory))
- ((and (eq major-mode 'dired-mode) default-input)
- (file-name-directory default-input))
- ((and (not (string= default-input ""))
- default-input))
- (t (expand-file-name (helm-current-directory)))))
- (input-as-presel (null (nth 0 (file-attributes input))))
- (presel (helm-aif (or hist
- (and input-as-presel input)
- (buffer-file-name (current-buffer))
- (and (eq major-mode 'dired-mode)
- default-input))
- (if helm-ff-transformer-show-only-basename
- (helm-basename it) it))))
- (set-text-properties 0 (length input) nil input)
- (helm-find-files-1 input (and presel (concat "^" (regexp-quote presel))))))
-
-;;;###autoload
-(defun helm-for-files ()
- "Preconfigured `helm' for opening files.
-Run all sources defined in `helm-for-files-preferred-list'."
- (interactive)
- (unless helm-source-buffers-list
- (setq helm-source-buffers-list
- (helm-make-source "Buffers" 'helm-source-buffers)))
- (helm :sources helm-for-files-preferred-list
- :ff-transformer-show-only-basename nil
- :buffer "*helm for files*"))
-
-;;;###autoload
-(defun helm-multi-files ()
- "Preconfigured helm similar to `helm-for-files' but that don't run locate.
-Allow toggling from locate to others sources.
-This allow seeing first if what you search is in other sources before launching
-locate."
- (interactive)
- (unless helm-source-buffers-list
- (setq helm-source-buffers-list
- (helm-make-source "Buffers" 'helm-source-buffers)))
- (setq helm-multi-files--toggle-locate nil)
- (let ((sources (remove 'helm-source-locate helm-for-files-preferred-list))
- (old-key (lookup-key
- helm-map
- (read-kbd-macro helm-multi-files-toggle-locate-binding))))
- (with-helm-temp-hook 'helm-after-initialize-hook
- (define-key helm-map (kbd helm-multi-files-toggle-locate-binding)
- 'helm-multi-files-toggle-to-locate))
- (unwind-protect
- (helm :sources sources
- :ff-transformer-show-only-basename nil
- :buffer "*helm multi files*")
- (define-key helm-map (kbd helm-multi-files-toggle-locate-binding)
- old-key))))
-
-;;;###autoload
-(defun helm-recentf ()
- "Preconfigured `helm' for `recentf'."
- (interactive)
- (helm :sources 'helm-source-recentf
- :ff-transformer-show-only-basename nil
- :buffer "*helm recentf*"))
-
-(provide 'helm-files)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-files.el ends here
+++ /dev/null
-;;; helm-font --- Font and ucs selection for Helm -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-
-(defgroup helm-font nil
- "Related applications to display fonts in helm."
- :group 'helm)
-
-(defvar helm-ucs-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "<C-backspace>") 'helm-ucs-persistent-delete)
- (define-key map (kbd "<C-left>") 'helm-ucs-persistent-backward)
- (define-key map (kbd "<C-right>") 'helm-ucs-persistent-forward)
- (define-key map (kbd "<C-return>") 'helm-ucs-persistent-insert)
- map)
- "Keymap for `helm-ucs'.")
-
-(defface helm-ucs-char
- '((t (:foreground "Gold")))
- "Face used to display ucs characters."
- :group 'helm-font)
-
-;;; Xfont selection
-;;
-;;
-(defvar helm-xfonts-cache nil)
-(defvar helm-previous-font nil)
-(defvar helm-source-xfonts
- (helm-build-sync-source "X Fonts"
- :init (lambda ()
- (unless helm-xfonts-cache
- (setq helm-xfonts-cache
- (x-list-fonts "*")))
- ;; Save current font so it can be restored in cleanup
- (setq helm-previous-font (cdr (assoc 'font (frame-parameters)))))
- :candidates 'helm-xfonts-cache
- :action '(("Copy font to kill ring" . (lambda (elm)
- (kill-new elm)))
- ("Set font" . (lambda (elm)
- (kill-new elm)
- (set-frame-font elm 'keep-size)
- (message "Font copied to kill ring"))))
- :cleanup (lambda ()
- ;; Restore previous font
- (set-frame-font helm-previous-font 'keep-size))
- :persistent-action (lambda (new-font)
- (set-frame-font new-font 'keep-size)
- (kill-new new-font))
- :persistent-help "Preview font and copy to kill-ring"))
-
-;;; 𝕌𝕔𝕤 𝕊𝕪𝕞𝕓𝕠𝕝 𝕔𝕠𝕞𝕡𝕝𝕖𝕥𝕚𝕠𝕟
-;;
-;;
-(defvar helm-ucs--max-len nil)
-(defvar helm-ucs--names nil)
-
-(defun helm-calculate-ucs-max-len ()
- "Calculate the length of longest `ucs-names' candidate."
- (cl-loop for (_n . v) in (ucs-names)
- maximize (length (format "#x%x:" v)) into code
- maximize (max 1 (string-width (format "%c" v))) into char
- finally return (cons code char)))
-
-(defun helm-ucs-init ()
- "Initialize an helm buffer with ucs symbols.
-Only math* symbols are collected."
- (unless helm-ucs--max-len
- (setq helm-ucs--max-len
- (helm-calculate-ucs-max-len)))
- (or helm-ucs--names
- (setq helm-ucs--names
- (cl-loop for (n . v) in (ucs-names)
- for len = (length (format "#x%x:" v))
- for diff = (- (car helm-ucs--max-len) len)
- for code = (format "(#x%x): " v)
- for char = (propertize (format "%c" v)
- 'face 'helm-ucs-char)
- unless (string= "" n) collect
- (concat code (make-string diff ? )
- char " " n)))))
-
-(defun helm-ucs-forward-char (_candidate)
- (with-helm-current-buffer
- (forward-char 1)))
-
-(defun helm-ucs-backward-char (_candidate)
- (with-helm-current-buffer
- (forward-char -1)))
-
-(defun helm-ucs-delete-backward (_candidate)
- (with-helm-current-buffer
- (delete-char -1)))
-
-(defun helm-ucs-insert (candidate n)
- (when (string-match
- "^(\\(#x[a-f0-9]+\\)): *\\(.\\) *\\([^:]+\\)+"
- candidate)
- (with-helm-current-buffer
- (insert (match-string n candidate)))))
-
-(defun helm-ucs-insert-char (candidate)
- (helm-ucs-insert candidate 2))
-
-(defun helm-ucs-insert-code (candidate)
- (helm-ucs-insert candidate 1))
-
-(defun helm-ucs-insert-name (candidate)
- (helm-ucs-insert candidate 3))
-
-(defun helm-ucs-persistent-insert ()
- (interactive)
- (with-helm-alive-p
- (helm-attrset 'action-insert 'helm-ucs-insert-char)
- (helm-execute-persistent-action 'action-insert)))
-(put 'helm-ucs-persistent-insert 'helm-only t)
-
-(defun helm-ucs-persistent-forward ()
- (interactive)
- (with-helm-alive-p
- (helm-attrset '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-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-execute-persistent-action 'action-delete)))
-(put 'helm-ucs-persistent-delete 'helm-only t)
-
-(defvar helm-source-ucs
- (helm-build-in-buffer-source "Ucs names"
- :data #'helm-ucs-init
- :get-line #'buffer-substring
- :help-message 'helm-ucs-help-message
- :match-part (lambda (candidate) (cadr (split-string candidate ":")))
- :filtered-candidate-transformer
- (lambda (candidates _source) (sort candidates #'helm-generic-sort-fn))
- :action '(("Insert character" . helm-ucs-insert-char)
- ("Insert character name" . helm-ucs-insert-name)
- ("Insert character code in hex" . helm-ucs-insert-code)
- ("Forward char" . helm-ucs-forward-char)
- ("Backward char" . helm-ucs-backward-char)
- ("Delete char backward" . helm-ucs-delete-backward)))
- "Source for collecting `ucs-names' math symbols.")
-
-;;;###autoload
-(defun helm-select-xfont ()
- "Preconfigured `helm' to select Xfont."
- (interactive)
- (helm :sources 'helm-source-xfonts
- :buffer "*helm select xfont*"))
-
-;;;###autoload
-(defun helm-ucs ()
- "Preconfigured helm for `ucs-names' math symbols."
- (interactive)
- (let ((char (helm-aif (char-after) (string it))))
- (helm :sources 'helm-source-ucs
- :keymap helm-ucs-map
- :input (and char (multibyte-string-p char) char))))
-
-(provide 'helm-font)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-font.el ends here
+++ /dev/null
-;;; helm-grep.el --- Helm Incremental Grep. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-regexp)
-
-;;; load wgrep proxy if it's available
-(require 'wgrep-helm nil t)
-
-(declare-function helm-buffer-list "helm-buffers")
-(declare-function helm-elscreen-find-file "helm-elscreen" (file))
-(declare-function View-quit "view")
-(declare-function doc-view-goto-page "doc-view" (page))
-(declare-function helm-mm-split-pattern "helm-multi-match")
-(declare-function helm--ansi-color-apply "helm-lib")
-(defvar helm--ansi-color-regexp)
-
-\f
-(defgroup helm-grep nil
- "Grep related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-grep-default-command
- "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 ,
-here a default command example for ack-grep:
-
-\(setq helm-grep-default-command \"ack-grep -Hn --smart-case --no-group %e %p %f\"
- helm-grep-default-recurse-command \"ack-grep -H --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).
-
-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
-independents, 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 handle badly
- repeated remote processes in a short delay (< to 5s)."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-default-recurse-command
- "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."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-default-zgrep-command
- "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."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-pdfgrep-default-command
- "pdfgrep --color always -niH %s %s"
- "Default command for pdfgrep.
-Option \"--color always\" is supported starting helm version 1.7.8,
-when used matchs will be highlighted according to GREP_COLORS env var."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-use-ioccur-style-keys t
- "Use Arrow keys to jump to occurences."
- :group 'helm-grep
- :type 'boolean)
-
-(defcustom helm-pdfgrep-default-read-command 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 `doc-view-mode' will be used instead of an external command."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-max-length-history 100
- "Max number of elements to save in `helm-grep-history'."
- :group 'helm-grep
- :type 'integer)
-
-(defcustom helm-zgrep-file-extension-regexp
- ".*\\(\\.gz\\|\\.bz\\|\\.xz\\|\\.lzma\\)$"
- "Default file extensions zgrep will search in."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-preferred-ext nil
- "This file extension will be preselected for grep."
- :group 'helm-grep
- :type 'string)
-
-(defcustom helm-grep-save-buffer-name-no-confirm nil
- "when *hgrep* already exists,auto append suffix."
- :group 'helm-grep
- :type 'boolean)
-
-(defcustom helm-grep-ignored-files
- (cons ".#*" (delq nil (mapcar (lambda (s)
- (unless (string-match-p "/\\'" s)
- (concat "*" s)))
- completion-ignored-extensions)))
- "List of file names which `helm-grep' shall exclude."
- :group 'helm-grep
- :type '(repeat string))
-
-(defcustom helm-grep-ignored-directories
- helm-walk-ignore-directories
- "List of names of sub-directories which `helm-grep' shall not recurse into."
- :group 'helm-grep
- :type '(repeat string))
-
-(defcustom helm-grep-truncate-lines t
- "When nil the grep line that appears will not be truncated."
- :group 'helm-grep
- :type 'boolean)
-
-(defcustom helm-grep-file-path-style '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."
- :group 'helm-grep
- :type '(choice (const :tag "Basename" basename)
- (const :tag "Absolute" absolute)
- (const :tag "Relative" relative)))
-
-\f
-;;; Faces
-;;
-;;
-(defgroup helm-grep-faces nil
- "Customize the appearance of helm-grep."
- :prefix "helm-"
- :group 'helm-grep
- :group 'helm-faces)
-
-(defface helm-grep-match
- '((((background light)) :foreground "#b00000")
- (((background dark)) :foreground "gold1"))
- "Face used to highlight grep matches."
- :group 'helm-grep-faces)
-
-(defface helm-grep-file
- '((t (:foreground "BlueViolet"
- :underline t)))
- "Face used to highlight grep results filenames."
- :group 'helm-grep-faces)
-
-(defface helm-grep-lineno
- '((t (:foreground "Darkorange1")))
- "Face used to highlight grep number lines."
- :group 'helm-grep-faces)
-
-(defface helm-grep-finish
- '((t (:foreground "Green")))
- "Face used in mode line when grep is finish."
- :group 'helm-grep-faces)
-
-(defface helm-grep-cmd-line
- '((t (:inherit diff-added)))
- "Face used to highlight grep command line when no results."
- :group 'helm-grep-faces)
-
-\f
-;;; Keymaps
-;;
-;;
-(defvar helm-grep-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-goto-next-file)
- (define-key map (kbd "M-<up>") 'helm-goto-precedent-file)
- (define-key map (kbd "C-c o") 'helm-grep-run-other-window-action)
- (define-key map (kbd "C-c C-o") 'helm-grep-run-other-frame-action)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- (define-key map (kbd "C-x C-s") 'helm-grep-run-save-buffer)
- (when helm-grep-use-ioccur-style-keys
- (define-key map (kbd "<right>") 'helm-execute-persistent-action)
- (define-key map (kbd "<left>") 'helm-grep-run-default-action))
- (delq nil map))
- "Keymap used in Grep sources.")
-
-(defvar helm-pdfgrep-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-goto-next-file)
- (define-key map (kbd "M-<up>") 'helm-goto-precedent-file)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- map)
- "Keymap used in pdfgrep.")
-
-(defvar helm-grep-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "RET") 'helm-grep-mode-jump)
- (define-key map (kbd "C-o") 'helm-grep-mode-jump-other-window)
- (define-key map (kbd "<C-down>") 'helm-grep-mode-jump-other-window-forward)
- (define-key map (kbd "<C-up>") 'helm-grep-mode-jump-other-window-backward)
- (define-key map (kbd "<M-down>") 'helm-gm-next-file)
- (define-key map (kbd "<M-up>") 'helm-gm-precedent-file)
- (define-key map (kbd "M-n") 'helm-grep-mode-jump-other-window-forward)
- (define-key map (kbd "M-p") 'helm-grep-mode-jump-other-window-backward)
- (define-key map (kbd "M-N") 'helm-gm-next-file)
- (define-key map (kbd "M-P") 'helm-gm-precedent-file)
- map))
-
-\f
-;;; Internals vars
-;;
-;;
-(defvar helm-rzgrep-cache (make-hash-table :test 'equal))
-(defvar helm-grep-default-function 'helm-grep-init)
-(defvar helm-zgrep-recurse-flag nil)
-(defvar helm-grep-history nil)
-(defvar helm-grep-last-targets nil)
-(defvar helm-grep-include-files nil)
-(defvar helm-grep-in-recurse nil)
-(defvar helm-grep-use-zgrep nil)
-(defvar helm-grep-default-directory-fn nil
- "A function that should return a directory to expand candidate to.
-It is intended to use as a let-bound variable, DON'T set this globaly.")
-(defvar helm-pdfgrep-targets nil)
-(defvar helm-grep-last-cmd-line nil)
-(defvar helm-grep-split-line-regexp "^\\([[:lower:][:upper:]]?:?.*?\\):\\([0-9]+\\):\\(.*\\)")
-
-\f
-;;; Init
-;;
-;;
-(defun helm-grep-prepare-candidates (candidates in-directory)
- "Prepare filenames and directories CANDIDATES for grep command line."
- ;; If one or more candidate is a directory, search in all files
- ;; of this candidate (e.g /home/user/directory/*).
- ;; If r option is enabled search also in subdidrectories.
- ;; We need here to expand wildcards to support crap windows filenames
- ;; as grep doesn't accept quoted wildcards (e.g "dir/*.el").
- (if helm-zgrep-recurse-flag
- (mapconcat 'shell-quote-argument candidates " ")
- ;; When candidate is a directory, search in all its files.
- ;; NOTE that `file-expand-wildcards' will return also
- ;; directories, they will be ignored by grep but not
- ;; by ack-grep that will grep all files of this directory
- ;; without recursing in their subdirs though, see that as a one
- ;; level recursion with ack-grep.
- ;; So I leave it as it is, considering it is a feature. [1]
- (cl-loop for i in candidates append
- (cond ((string-match "^git" helm-grep-default-command)
- (list i))
- ;; Candidate is a directory and we use recursion or ack.
- ((and (file-directory-p i)
- (or helm-grep-in-recurse
- ;; ack-grep accept directory [1].
- (helm-grep-use-ack-p)))
- (list (expand-file-name i)))
- ;; Grep doesn't support directory only when not in recurse.
- ((file-directory-p i)
- (file-expand-wildcards
- (concat (file-name-as-directory (expand-file-name i)) "*") t))
- ;; Candidate is a file or wildcard and we use recursion, use the
- ;; current directory instead of candidate.
- ((and (or (file-exists-p i) (string-match "[*]" i))
- helm-grep-in-recurse)
- (list (expand-file-name
- (directory-file-name ; Needed for windoze.
- (file-name-directory (directory-file-name i))))))
- ;; Else should be one or more file/directory
- ;; possibly marked.
- ;; When real is a normal filename without wildcard
- ;; file-expand-wildcards returns a list of one file.
- ;; wildcards should have been already handled by
- ;; helm-read-file-name or helm-find-files but do it from
- ;; here too in case we are called from elsewhere.
- (t (file-expand-wildcards i t))) into all-files ; [1]
- finally return
- (let ((files (if (file-remote-p in-directory)
- ;; Grep don't understand tramp filenames
- ;; use the local name.
- (mapcar (lambda (x)
- (file-remote-p x 'localname))
- all-files)
- all-files)))
- (if (string-match "^git" helm-grep-default-command)
- (mapconcat 'identity files " ")
- (mapconcat 'shell-quote-argument files " "))))))
-
-(defun helm-grep-command (&optional recursive)
- (let* ((com (if recursive
- helm-grep-default-recurse-command
- helm-grep-default-command))
- (exe (and com (car (split-string com " ")))))
- (if (and exe (string= exe "git")) "git-grep" exe)))
-
-(cl-defun helm-grep-use-ack-p (&key where)
- (let* ((rec-com (helm-grep-command t))
- (norm-com (helm-grep-command))
- (norm-com-ack-p (string-match "\\`ack" norm-com))
- (rec-com-ack-p (and rec-com (string-match "\\`ack" rec-com))))
- (cl-case where
- (default (and norm-com norm-com-ack-p))
- (recursive (and rec-com rec-com-ack-p))
- (strict (and norm-com rec-com rec-com-ack-p norm-com-ack-p))
- (t (and (not (and norm-com (string= norm-com "git-grep")))
- (or (and norm-com norm-com-ack-p)
- (and rec-com rec-com-ack-p)))))))
-
-(defun helm-grep--prepare-cmd-line (only-files &optional include zgrep)
- (let* ((default-directory (or (helm-default-directory)
- (expand-file-name helm-ff-default-directory)))
- (fnargs (helm-grep-prepare-candidates
- only-files default-directory))
- (ignored-files (unless (helm-grep-use-ack-p)
- (mapconcat
- (lambda (x)
- (concat "--exclude="
- (shell-quote-argument x)))
- helm-grep-ignored-files " ")))
- (ignored-dirs (unless (helm-grep-use-ack-p)
- (mapconcat
- ;; Need grep version >=2.5.4
- ;; of Gnuwin32 on windoze.
- (lambda (x)
- (concat "--exclude-dir="
- (shell-quote-argument x)))
- helm-grep-ignored-directories " ")))
- (exclude (unless (helm-grep-use-ack-p)
- (if helm-grep-in-recurse
- (concat (or include ignored-files)
- " " ignored-dirs)
- ignored-files)))
- (types (and (helm-grep-use-ack-p)
- ;; When %e format spec is not specified
- ;; in `helm-grep-default-command'
- ;; we need to pass an empty string
- ;; to types to avoid error.
- (or include "")))
- (smartcase (if (helm-grep-use-ack-p) ""
- (unless (let ((case-fold-search nil))
- (string-match-p
- "[[:upper:]]" helm-pattern)) "i"))))
- (format-spec
- helm-grep-default-command
- (delq nil
- (list (unless zgrep
- (if types
- (cons ?e types)
- (cons ?e exclude)))
- (cons ?c (or smartcase ""))
- (cons ?p (shell-quote-argument helm-pattern))
- (cons ?f fnargs))))))
-
-(defun helm-grep-init (cmd-line)
- "Start an asynchronous grep process with CMD-LINE using ZGREP if non--nil."
- (let* ((default-directory (or helm-ff-default-directory
- (helm-default-directory)))
- (zgrep (string-match "\\`zgrep" cmd-line))
- ;; Use pipe only with grep, zgrep or git-grep.
- (process-connection-type (and (not zgrep) (helm-grep-use-ack-p)))
- (tramp-verbose helm-tramp-verbose)
- non-essential)
- ;; Start grep process.
- (helm-log "Starting Grep process in directory `%s'" default-directory)
- (helm-log "Command line used was:\n\n%s"
- (concat ">>> " (propertize cmd-line 'face 'helm-grep-cmd-line) "\n\n"))
- (prog1 ; This function should return the process first.
- (start-file-process-shell-command
- "grep" helm-buffer cmd-line)
- ;; Init sentinel.
- (set-process-sentinel
- (get-buffer-process helm-buffer)
- (lambda (process event)
- (let* ((err (process-exit-status process))
- (noresult (= err 1)))
- (unless err
- (helm-process-deferred-sentinel-hook
- process event (helm-default-directory)))
- (cond ((and noresult
- ;; [FIXME] This is a workaround for zgrep
- ;; that exit with code 1
- ;; after a certain amount of results.
- (not (with-helm-buffer helm-grep-use-zgrep)))
- (with-helm-buffer
- (insert (concat "* Exit with code 1, no result found,"
- " command line was:\n\n "
- (propertize helm-grep-last-cmd-line
- 'face 'helm-grep-cmd-line)))
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format
- "[%s process finished - (no results)] "
- (if helm-grep-use-zgrep
- "Zgrep"
- (capitalize
- (if helm-grep-in-recurse
- (helm-grep-command t)
- (helm-grep-command)))))
- 'face 'helm-grep-finish))))))
- ((string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format
- "[%s process finished - (%s results)] "
- (if helm-grep-use-zgrep
- "Zgrep"
- (capitalize
- (if helm-grep-in-recurse
- (helm-grep-command t)
- (helm-grep-command))))
- (helm-get-candidate-number))
- 'face 'helm-grep-finish))))
- (force-mode-line-update)))
- ;; Catch error output in log.
- (t (helm-log
- "Error: %s %s"
- (if helm-grep-use-zgrep "Zgrep" "Grep")
- (replace-regexp-in-string "\n" "" event))))))))))
-
-(defun helm-grep-collect-candidates ()
- (let ((cmd-line (helm-grep--prepare-cmd-line
- helm-grep-last-targets
- helm-grep-include-files
- helm-grep-use-zgrep)))
- (set (make-local-variable 'helm-grep-last-cmd-line) cmd-line)
- (funcall helm-grep-default-function cmd-line)))
-
-\f
-;;; Actions
-;;
-;;
-(defun helm-grep-action (candidate &optional where mark)
- "Define a default action for `helm-do-grep-1' on CANDIDATE.
-WHERE can be one of other-window, elscreen, other-frame."
- (let* ((split (helm-grep-split-line candidate))
- (lineno (string-to-number (nth 1 split)))
- (loc-fname (or (with-current-buffer
- (if (eq major-mode 'helm-grep-mode)
- (current-buffer)
- helm-buffer)
- (get-text-property (point-at-bol) 'help-echo))
- (car split)))
- (tramp-method (file-remote-p (or helm-ff-default-directory
- default-directory) 'method))
- (tramp-host (file-remote-p (or helm-ff-default-directory
- default-directory) 'host))
- (tramp-prefix (concat "/" tramp-method ":" tramp-host ":"))
- (fname (if tramp-host
- (concat tramp-prefix loc-fname) loc-fname)))
- (cl-case where
- (other-window (find-file-other-window fname))
- (elscreen (helm-elscreen-find-file fname))
- (other-frame (find-file-other-frame fname))
- (grep (helm-grep-save-results-1))
- (pdf (if helm-pdfgrep-default-read-command
- (helm-pdfgrep-action-1 split lineno (car split))
- (find-file (car split)) (doc-view-goto-page lineno)))
- (t (find-file fname)))
- (unless (or (eq where 'grep) (eq where 'pdf))
- (helm-goto-line lineno))
- (when mark
- (set-marker (mark-marker) (point))
- (push-mark (point) 'nomsg))
- ;; Save history
- (unless (or helm-in-persistent-action
- (eq major-mode 'helm-grep-mode)
- (string= helm-pattern ""))
- (setq helm-grep-history
- (cons helm-pattern
- (delete helm-pattern helm-grep-history)))
- (when (> (length helm-grep-history)
- helm-grep-max-length-history)
- (setq helm-grep-history
- (delete (car (last helm-grep-history))
- helm-grep-history))))))
-
-(defun helm-grep-persistent-action (candidate)
- "Persistent action for `helm-do-grep-1'.
-With a prefix arg record CANDIDATE in `mark-ring'."
- (if current-prefix-arg
- (helm-grep-action candidate nil 'mark)
- (helm-grep-action candidate))
- (helm-highlight-current-line))
-
-(defun helm-grep-other-window (candidate)
- "Jump to result in other window from helm grep."
- (helm-grep-action candidate 'other-window))
-
-(defun helm-grep-other-frame (candidate)
- "Jump to result in other frame from helm grep."
- (helm-grep-action candidate 'other-frame))
-
-(defun helm-grep-jump-elscreen (candidate)
- "Jump to result in elscreen from helm grep."
- (helm-grep-action candidate 'elscreen))
-
-(defun helm-goto-next-or-prec-file (n)
- "Go to next or precedent candidate file in helm grep/etags buffers.
-If N is positive go forward otherwise go backward."
- (let* ((allow-mode (or (eq major-mode 'helm-grep-mode)
- (eq major-mode 'helm-moccur-mode)))
- (sel (if allow-mode
- (buffer-substring (point-at-bol) (point-at-eol))
- (helm-get-selection nil t)))
- (current-line-list (helm-grep-split-line sel))
- (current-fname (nth 0 current-line-list))
- (bob-or-eof (if (eq n 1) 'eobp 'bobp))
- (mark-maybe (lambda ()
- (if allow-mode
- (ignore)
- (helm-mark-current-line)))))
- (catch 'break
- (while (not (funcall bob-or-eof))
- (forward-line n) ; Go forward or backward depending of n value.
- ;; Exit when current-fname is not matched or in `helm-grep-mode'
- ;; the line is not a grep line i.e 'fname:num:tag'.
- (setq sel (buffer-substring (point-at-bol) (point-at-eol)))
- (unless (or (string= current-fname
- (car (helm-grep-split-line sel)))
- (and (eq major-mode 'helm-grep-mode)
- (not (get-text-property (point-at-bol) 'help-echo))))
- (funcall mark-maybe)
- (throw 'break nil))))
- (cond ((and (> n 0) (eobp))
- (re-search-backward ".")
- (forward-line 0)
- (funcall mark-maybe))
- ((and (< n 0) (bobp))
- (helm-aif (next-single-property-change (point-at-bol) 'help-echo)
- (goto-char it)
- (forward-line 1))
- (funcall mark-maybe)))
- (helm-log-run-hook 'helm-move-selection-after-hook)))
-
-;;;###autoload
-(defun helm-goto-precedent-file ()
- "Go to precedent file in helm grep/etags buffers."
- (interactive)
- (with-helm-alive-p
- (with-helm-window
- (helm-goto-next-or-prec-file -1))))
-(put 'helm-goto-precedent-file 'helm-only t)
-
-;;;###autoload
-(defun helm-goto-next-file ()
- "Go to precedent file in helm grep/etags buffers."
- (interactive)
- (with-helm-window
- (helm-goto-next-or-prec-file 1)))
-
-(defun helm-grep-run-default-action ()
- "Run grep default action from `helm-do-grep-1'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-action)))
-(put 'helm-grep-run-default-action 'helm-only t)
-
-(defun helm-grep-run-other-window-action ()
- "Run grep goto other window action from `helm-do-grep-1'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-other-window)))
-(put 'helm-grep-run-other-window-action 'helm-only t)
-
-(defun helm-grep-run-other-frame-action ()
- "Run grep goto other frame action from `helm-do-grep-1'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-other-frame)))
-(put 'helm-grep-run-other-frame-action 'helm-only t)
-
-(defun helm-grep-run-save-buffer ()
- "Run grep save results action from `helm-do-grep-1'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-grep-save-results)))
-(put 'helm-grep-run-save-buffer 'helm-only t)
-
-\f
-;;; helm-grep-mode
-;;
-;;
-(defun helm-grep-save-results (candidate)
- (helm-grep-action candidate 'grep))
-
-(defun helm-grep-save-results-1 ()
- "Save helm grep result in a `helm-grep-mode' buffer."
- (let ((buf "*hgrep*")
- new-buf)
- (when (get-buffer buf)
- (if helm-grep-save-buffer-name-no-confirm
- (setq new-buf (format "*hgrep|%s|-%s" helm-pattern
- (format-time-string "%H-%M-%S*")))
- (setq new-buf (helm-read-string "GrepBufferName: " buf))
- (cl-loop for b in (helm-buffer-list)
- when (and (string= new-buf b)
- (not (y-or-n-p
- (format "Buffer `%s' already exists overwrite? "
- new-buf))))
- do (setq new-buf (helm-read-string "GrepBufferName: " "*hgrep "))))
- (setq buf new-buf))
- (with-current-buffer (get-buffer-create buf)
- (setq buffer-read-only t)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert "-*- mode: helm-grep -*-\n\n"
- (format "Grep Results for `%s':\n\n" helm-pattern))
- (save-excursion
- (insert (with-current-buffer helm-buffer
- (goto-char (point-min)) (forward-line 1)
- (buffer-substring (point) (point-max))))))
- (helm-grep-mode) (pop-to-buffer buf))
- (message "Helm Grep Results saved in `%s' buffer" buf)))
-
-(define-derived-mode helm-grep-mode
- special-mode "helm-grep"
- "Major mode to provide actions in helm grep saved buffer.
-
-Special commands:
-\\{helm-grep-mode-map}"
- (set (make-local-variable 'helm-grep-last-cmd-line)
- (with-helm-buffer helm-grep-last-cmd-line))
- (set (make-local-variable 'revert-buffer-function)
- #'helm-grep-mode--revert-buffer-function))
-
-(defun helm-grep-mode--revert-buffer-function (&optional _ignore-auto _noconfirm)
- (goto-char (point-min))
- (re-search-forward "^Grep Results for" nil t)
- (forward-line 0)
- (when (re-search-forward "^$" nil t)
- (forward-line 1))
- (let ((inhibit-read-only t))
- (delete-region (point) (point-max)))
- (message "Reverting buffer...")
- (set-process-sentinel
- (start-file-process-shell-command
- "hgrep" (generate-new-buffer "*hgrep revert*") helm-grep-last-cmd-line)
- (lambda (process event)
- (when (string= event "finished\n")
- (with-current-buffer (current-buffer)
- (let ((inhibit-read-only t))
- (save-excursion
- (cl-loop for line in (with-current-buffer (process-buffer process)
- (prog1 (split-string (buffer-string) "\n")
- (kill-buffer)))
- when (string-match helm-grep-split-line-regexp line)
- do (insert (propertize
- (car (helm-grep-filter-one-by-one line))
- ;; needed for wgrep.
- 'helm-realvalue line)
- "\n"))))
- (message "Reverting buffer done"))))))
-
-(defun helm-gm-next-file ()
- (interactive)
- (helm-goto-next-or-prec-file 1))
-
-(defun helm-gm-precedent-file ()
- (interactive)
- (helm-goto-next-or-prec-file -1))
-
-(defun helm-grep-mode-jump ()
- (interactive)
- (helm-grep-action
- (buffer-substring (point-at-bol) (point-at-eol))))
-
-(defun helm-grep-mode-jump-other-window-1 (arg)
- (let ((candidate (buffer-substring (point-at-bol) (point-at-eol))))
- (condition-case nil
- (progn
- (save-selected-window
- (helm-grep-action candidate 'other-window)
- (recenter))
- (forward-line arg))
- (error nil))))
-
-(defun helm-grep-mode-jump-other-window-forward ()
- (interactive)
- (helm-grep-mode-jump-other-window-1 1))
-
-(defun helm-grep-mode-jump-other-window-backward ()
- (interactive)
- (helm-grep-mode-jump-other-window-1 -1))
-
-(defun helm-grep-mode-jump-other-window ()
- (interactive)
- (let ((candidate (buffer-substring (point-at-bol) (point-at-eol))))
- (condition-case nil
- (helm-grep-action candidate 'other-window)
- (error nil))))
-
-\f
-;;; ack-grep types
-;;
-;;
-(defun helm-grep-hack-types ()
- "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.
- ;; `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
- ;; `helm-grep-use-ack-p'.
- (call-process (helm-grep-command t) nil t nil "--help-types")
- (goto-char (point-min))
- (cl-loop while (re-search-forward
- "^ *--\\(\\[no\\]\\)\\([^. ]+\\) *\\(.*\\)" nil t)
- collect (cons (concat (match-string 2)
- " [" (match-string 3) "]")
- (match-string 2))
- collect (cons (concat "no" (match-string 2)
- " [" (match-string 3) "]")
- (concat "no" (match-string 2))))))
-
-(defun helm-grep-ack-types-transformer (candidates _source)
- (cl-loop for i in candidates
- if (stringp i)
- collect (rassoc i helm-grep-ack-types-cache)
- else
- collect i))
-
-(defvar helm-grep-ack-types-cache nil)
-(defun helm-grep-read-ack-type ()
- "Select types for the '--type' argument of ack-grep."
- (require 'helm-mode)
- (require 'helm-adaptive)
- (setq helm-grep-ack-types-cache (helm-grep-hack-types))
- (let ((types (helm-comp-read
- "Types: " helm-grep-ack-types-cache
- :name "*Ack-grep types*"
- :marked-candidates t
- :must-match t
- :fc-transformer '(helm-adaptive-sort
- helm-grep-ack-types-transformer)
- :buffer "*helm ack-types*")))
- (mapconcat (lambda (type) (concat "--type=" type)) types " ")))
-
-\f
-;;; grep extensions
-;;
-;;
-(defun helm-grep-guess-extensions (files)
- "Try to guess file extensions in FILES list when using grep recurse.
-These extensions will be added to command line with --include arg of grep."
- (cl-loop with ext-list = (list helm-grep-preferred-ext "*")
- with lst = (if (file-directory-p (car files))
- (directory-files
- (car files) nil
- directory-files-no-dot-files-regexp)
- files)
- for i in lst
- for ext = (file-name-extension i 'dot)
- for glob = (and ext (not (string= ext ""))
- (concat "*" ext))
- unless (or (not glob)
- (and glob-list (member glob glob-list))
- (and glob-list (member glob ext-list))
- (and glob-list (member glob helm-grep-ignored-files)))
- collect glob into glob-list
- finally return (delq nil (append ext-list glob-list))))
-
-(defun helm-grep-get-file-extensions (files)
- "Try to return a list of file extensions to pass to '--include' arg of grep."
- (let* ((all-exts (helm-grep-guess-extensions
- (mapcar 'expand-file-name files)))
- (extensions (helm-comp-read "Search Only in: " all-exts
- :marked-candidates t
- :fc-transformer 'helm-adaptive-sort
- :buffer "*helm grep exts*"
- :name "*helm grep extensions*")))
- (when (listp extensions) ; Otherwise it is empty string returned by C-RET.
- ;; If extensions is a list of one string containing spaces,
- ;; assume user entered more than one glob separated by space(s) and
- ;; split this string to pass it later to mapconcat.
- ;; e.g '("*.el *.py")
- (cl-loop for i in extensions
- append (split-string-and-unquote i " ")))))
-
-\f
-;;; Set up source
-;;
-;;
-(defvar helm-source-grep nil)
-(defun helm-do-grep-1 (targets &optional recurse zgrep exts default-input input)
- "Launch grep on a list of TARGETS files.
-When RECURSE is given use -r option of grep and prompt user
-to set the --include args of grep.
-You can give more than one arg separated by space at prompt.
-e.g *.el *.py *.tex.
-From lisp use the EXTS argument as a list of extensions as above.
-If you are using ack-grep, you will be prompted for --type
-instead and EXTS will be ignored.
-If prompt is empty `helm-grep-ignored-files' are added to --exclude.
-Argument DEFAULT-INPUT is use as `default' arg of `helm' and INPUT
-is used as `input' arg of `helm', See `helm' docstring.
-ZGREP when non--nil use zgrep instead, without prompting for a choice
-in recurse, and ignoring EXTS, search being made on
-`helm-zgrep-file-extension-regexp'."
- (when (and (helm-grep-use-ack-p)
- helm-ff-default-directory
- (file-remote-p helm-ff-default-directory))
- (error "Error: Remote operation not supported with ack-grep."))
- (let* (non-essential
- (exts (and recurse
- ;; [FIXME] I could handle this from helm-walk-directory.
- (not zgrep) ; zgrep doesn't handle -r opt.
- (not (helm-grep-use-ack-p :where 'recursive))
- (or exts (helm-grep-get-file-extensions targets))))
- (include-files (and exts
- (mapconcat (lambda (x)
- (concat "--include="
- (shell-quote-argument x)))
- (if (> (length exts) 1)
- (remove "*" exts)
- exts) " ")))
- (types (and (not include-files)
- (not zgrep)
- recurse
- (helm-grep-use-ack-p :where 'recursive)
- ;; When %e format spec is not specified
- ;; ignore types and do not prompt for choice.
- (string-match "%e" helm-grep-default-command)
- (helm-grep-read-ack-type)))
- (follow (and helm-follow-mode-persistent
- (assoc-default 'follow helm-source-grep))))
- ;; When called as action from an other source e.g *-find-files
- ;; we have to kill action buffer.
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- ;; If `helm-find-files' haven't already started,
- ;; give a default value to `helm-ff-default-directory'.
- (unless helm-ff-default-directory
- (setq helm-ff-default-directory default-directory))
- ;; We need to store these vars locally
- ;; to pass infos later to `helm-resume'.
- (helm-set-local-variable 'helm-zgrep-recurse-flag (and recurse zgrep)
- 'helm-grep-last-targets targets
- 'helm-grep-include-files (or include-files types)
- 'helm-grep-in-recurse recurse
- 'helm-grep-use-zgrep zgrep
- 'helm-grep-default-command
- (cond (zgrep helm-default-zgrep-command)
- (recurse helm-grep-default-recurse-command)
- ;; When resuming the local value of
- ;; `helm-grep-default-command' is used, only git-grep
- ;; should need this.
- (t helm-grep-default-command)))
- ;; Setup the source.
- (setq helm-source-grep
- (helm-build-async-source
- (if zgrep "Zgrep" (capitalize (if recurse
- (helm-grep-command t)
- (helm-grep-command))))
- :candidates-process 'helm-grep-collect-candidates
- :filter-one-by-one 'helm-grep-filter-one-by-one
- :keymap helm-grep-map
- :nohighlight t
- :nomark t
- :candidate-number-limit 9999
- :help-message 'helm-grep-help-message
- :history 'helm-grep-history
- :action (helm-make-actions
- "Find File" 'helm-grep-action
- "Find file other frame" 'helm-grep-other-frame
- (lambda () (and (locate-library "elscreen")
- "Find file in Elscreen"))
- 'helm-grep-jump-elscreen
- "Save results in grep buffer" 'helm-grep-save-results
- "Find file other window" 'helm-grep-other-window)
- :persistent-action 'helm-grep-persistent-action
- :persistent-help "Jump to line (`C-u' Record in mark ring)"
- :requires-pattern 2
- :follow follow))
- (helm
- :sources 'helm-source-grep
- :buffer (format "*helm %s*" (if zgrep "zgrep" (helm-grep-command recurse)))
- :default default-input
- :input input
- :keymap helm-grep-map
- :history 'helm-grep-history
- :truncate-lines helm-grep-truncate-lines)))
-
-
-\f
-;;; zgrep
-;;
-;;
-(defun helm-ff-zgrep-1 (flist recursive)
- (unwind-protect
- (let* ((def-dir (or helm-ff-default-directory
- default-directory))
- (only (if recursive
- (or (gethash def-dir helm-rzgrep-cache)
- (puthash
- def-dir
- (helm-walk-directory
- def-dir
- :directories nil
- :path 'full
- :match helm-zgrep-file-extension-regexp)
- helm-rzgrep-cache))
- flist)))
- (helm-do-grep-1 only recursive 'zgrep))
- (setq helm-zgrep-recurse-flag nil)))
-
-\f
-;;; transformers
-;;
-;;
-(defun helm-grep-split-line (line)
- "Split a grep output line."
- ;; The output of grep may send a truncated line in this chunk,
- ;; so don't split until grep line is valid, that is
- ;; once the second part of the line comes with next chunk
- ;; send by process.
- (when (string-match helm-grep-split-line-regexp line)
- ;; Don't use split-string because buffer/file name or string
- ;; may contain a ":".
- (cl-loop for n from 1 to 3 collect (match-string n line))))
-
-(defun helm-grep--filter-candidate-1 (candidate &optional dir)
- (let* ((root (or dir (and helm-grep-default-directory-fn
- (funcall helm-grep-default-directory-fn))))
- (ansi-p (string-match-p helm--ansi-color-regexp candidate))
- (line (if ansi-p (helm--ansi-color-apply candidate) candidate))
- (split (helm-grep-split-line line))
- (fname (if (and root split)
- (expand-file-name (car split) root)
- (car-safe split)))
- (lineno (nth 1 split))
- (str (nth 2 split))
- (display-fname (cl-ecase helm-grep-file-path-style
- (basename (and fname (file-name-nondirectory fname)))
- (absolute fname)
- (relative (and fname root
- (file-relative-name fname root))))))
- (if (and display-fname lineno str)
- (cons (concat (propertize display-fname
- 'face 'helm-grep-file
- 'help-echo fname)
- ":"
- (propertize lineno 'face 'helm-grep-lineno)
- ":"
- (if ansi-p str (helm-grep-highlight-match str)))
- line)
- "")))
-
-(defun helm-grep-filter-one-by-one (candidate)
- "`filter-one-by-one' transformer function for `helm-do-grep-1'."
- (let ((helm-grep-default-directory-fn
- (or helm-grep-default-directory-fn
- (lambda () (or helm-ff-default-directory
- (helm-default-directory)
- default-directory)))))
- (if (consp candidate)
- ;; Already computed do nothing (default as input).
- candidate
- (and (stringp candidate)
- (helm-grep--filter-candidate-1 candidate)))))
-
-(defun helm-grep-highlight-match (str &optional multi-match)
- "Highlight in string STR all occurences matching `helm-pattern'."
- (let (beg end)
- (condition-case-unless-debug nil
- (with-temp-buffer
- (insert (propertize str 'read-only nil)) ; Fix (#1176)
- (goto-char (point-min))
- (cl-loop for reg in
- (if multi-match
- ;; (m)occur.
- (cl-loop for r in (helm-mm-split-pattern
- helm-pattern)
- unless (string-match "\\`!" r)
- collect
- (helm-aif (and helm-migemo-mode
- (assoc r helm-mm--previous-migemo-info))
- (cdr it) r))
- ;; async sources (grep, gid etc...)
- (list helm-input))
- do
- (while (and (re-search-forward reg nil t)
- (> (- (setq end (match-end 0))
- (setq beg (match-beginning 0))) 0))
- (add-text-properties beg end '(face helm-grep-match)))
- do (goto-char (point-min)))
- (buffer-string))
- (error nil))))
-
-\f
-;;; Grep from buffer list
-;;
-;;
-(defun helm-grep-buffers-1 (candidate &optional zgrep)
- "Run grep on all file--buffers or CANDIDATE if it is a file--buffer.
-If one of selected buffers is not a file--buffer,
-it is ignored and grep will run on all others file--buffers.
-If only one candidate is selected and it is not a file--buffer,
-switch to this buffer and run `helm-occur'.
-If a prefix arg is given run grep on all buffers ignoring non--file-buffers."
- (let* ((prefarg (or current-prefix-arg helm-current-prefix-arg))
- (helm-ff-default-directory
- (if (and helm-ff-default-directory
- (file-remote-p helm-ff-default-directory))
- default-directory
- helm-ff-default-directory))
- (cands (if prefarg
- (buffer-list)
- (helm-marked-candidates)))
- (win-conf (current-window-configuration))
- ;; Non--fname and remote buffers are ignored.
- (bufs (cl-loop for buf in cands
- for fname = (buffer-file-name (get-buffer buf))
- when (and fname (not (file-remote-p fname)))
- collect (expand-file-name fname))))
- (if bufs
- (if zgrep
- (helm-do-grep-1 bufs nil 'zgrep)
- (helm-do-grep-1 bufs))
- ;; bufs is empty, thats mean we have only CANDIDATE
- ;; and it is not a buffer-filename, fallback to occur.
- (switch-to-buffer candidate)
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (helm-occur)
- (when (eq helm-exit-status 1)
- (set-window-configuration win-conf)))))
-
-(defun helm-grep-buffers (candidate)
- "Action to grep buffers."
- (helm-grep-buffers-1 candidate))
-
-(defun helm-zgrep-buffers (candidate)
- "Action to zgrep buffers."
- (helm-grep-buffers-1 candidate 'zgrep))
-
-\f
-;;; Helm interface for pdfgrep
-;; pdfgrep program <http://pdfgrep.sourceforge.net/>
-;; and a pdf-reader (e.g xpdf) are needed.
-;;
-(defvar helm-pdfgrep-default-function 'helm-pdfgrep-init)
-(defun helm-pdfgrep-init (only-files)
- "Start an asynchronous pdfgrep process in ONLY-FILES list."
- (let* ((default-directory (or helm-ff-default-directory
- default-directory))
- (fnargs (helm-grep-prepare-candidates
- (if (file-remote-p default-directory)
- (mapcar (lambda (x)
- (file-remote-p x 'localname))
- only-files)
- only-files)
- default-directory))
- (cmd-line (format helm-pdfgrep-default-command
- helm-pattern
- fnargs))
- process-connection-type)
- ;; Start pdf grep process.
- (helm-log "Starting Pdf Grep process in directory `%s'" default-directory)
- (helm-log "Command line used was:\n\n%s"
- (concat ">>> " (propertize cmd-line 'face 'helm-grep-cmd-line) "\n\n"))
- (prog1
- (start-file-process-shell-command
- "pdfgrep" helm-buffer cmd-line)
- (message nil)
- (set-process-sentinel
- (get-buffer-process helm-buffer)
- (lambda (_process event)
- (if (string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format "[Pdfgrep Process Finish - %s result(s)] "
- (max (1- (count-lines
- (point-min) (point-max))) 0))
- 'face 'helm-grep-finish))))
- (force-mode-line-update))
- (helm-log "Error: Pdf grep %s"
- (replace-regexp-in-string "\n" "" event))))))))
-
-(defun helm-do-pdfgrep-1 (only)
- "Launch pdfgrep with a list of ONLY files."
- (unless (executable-find "pdfgrep")
- (error "Error: No such program `pdfgrep'."))
- (let* (helm-grep-in-recurse) ; recursion is never used in pdfgrep.
- ;; When called as action from an other source e.g *-find-files
- ;; we have to kill action buffer.
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (setq helm-pdfgrep-targets only)
- (helm
- :sources (helm-build-async-source "PdfGrep"
- :init (lambda ()
- ;; If `helm-find-files' haven't already started,
- ;; give a default value to `helm-ff-default-directory'.
- (setq helm-ff-default-directory (or helm-ff-default-directory
- default-directory)))
- :candidates-process (lambda ()
- (funcall helm-pdfgrep-default-function helm-pdfgrep-targets))
- :nohighlight t
- :nomark t
- :filter-one-by-one #'helm-grep-filter-one-by-one
- :candidate-number-limit 9999
- :history 'helm-grep-history
- :keymap helm-pdfgrep-map
- :help-message 'helm-pdfgrep-help-message
- :action #'helm-pdfgrep-action
- :persistent-help "Jump to PDF Page"
- :requires-pattern 2)
- :buffer "*helm pdfgrep*"
- :history 'helm-grep-history)))
-
-(defun helm-pdfgrep-action (candidate)
- (helm-grep-action candidate 'pdf))
-
-(defun helm-pdfgrep-action-1 (_split pageno fname)
- (save-selected-window
- (start-file-process-shell-command
- "pdf-reader" nil
- (format-spec helm-pdfgrep-default-read-command
- (list (cons ?f fname) (cons ?p pageno))))))
-\f
-;;; AG - AT
-;;
-;; https://github.com/ggreer/the_silver_searcher
-;; https://github.com/monochromegane/the_platinum_searcher
-
-(defcustom helm-grep-ag-command
- "ag --line-numbers -S --hidden --color --nogroup %s %s"
- "The default command for AG or PT.
-Takes two format specs, the first for pattern and the second for directory.
-
-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).
-
-You can use safely \"--color\" (default)."
- :group 'helm-grep
- :type 'string)
-
-(defun helm-grep--ag-command ()
- (car (split-string helm-grep-ag-command)))
-
-(defun helm-grep-ag-init (directory)
- (let ((cmd-line (format helm-grep-ag-command
- (shell-quote-argument helm-pattern)
- (shell-quote-argument directory))))
- (set (make-local-variable 'helm-grep-last-cmd-line) cmd-line)
- (prog1
- (start-process-shell-command
- "ag" helm-buffer cmd-line)
- (set-process-sentinel
- (get-buffer-process helm-buffer)
- (lambda (_process event)
- (when (string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format
- "[%s process finished - (%s results)] "
- (upcase (helm-grep--ag-command))
- (helm-get-candidate-number))
- 'face 'helm-grep-finish))))
- (force-mode-line-update))))))))
-
-(defvar helm-source-grep-ag nil)
-(defun helm-grep-ag-1 (directory)
- (setq helm-source-grep-ag
- (helm-build-async-source (upcase (helm-grep--ag-command))
- :header-name (lambda (name)
- (format "%s [%s]"
- name (abbreviate-file-name directory)))
- :candidates-process
- (lambda () (helm-grep-ag-init directory))
- :nohighlight t
- :keymap helm-grep-map
- :help-message 'helm-grep-help-message
- :filter-one-by-one 'helm-grep-filter-one-by-one
- :persistent-action 'helm-grep-persistent-action
- :candidate-number-limit 99999
- :requires-pattern 2
- :nomark t
- :action (helm-make-actions
- "Find File" 'helm-grep-action
- "Find file other frame" 'helm-grep-other-frame
- (lambda () (and (locate-library "elscreen")
- "Find file in Elscreen"))
- 'helm-grep-jump-elscreen
- "Save results in grep buffer" 'helm-grep-save-results
- "Find file other window" 'helm-grep-other-window)))
- (helm :sources 'helm-source-grep-ag
- :keymap helm-grep-map
- :truncate-lines helm-grep-truncate-lines
- :buffer (format "*helm %s*" (helm-grep--ag-command))))
-
-;;; Git grep
-;;
-;;
-(defcustom helm-grep-git-grep-command
- "git grep -n%cH --color=always --exclude-standard --no-index --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.
-You have also to enable this in global \".gitconfig\" with
- \"git config --global core.excludesfile ~/.gitignore_global\"."
- :group 'helm-grep
- :type 'string)
-
-(defun helm-grep-git-1 (directory &optional all)
- (require 'vc)
- (let* ((helm-grep-default-command helm-grep-git-grep-command)
- helm-grep-default-recurse-command
- ;; Expand filename of each candidate with the git root dir.
- ;; The filename will be in the help-echo prop.
- (helm-grep-default-directory-fn (lambda ()
- (vc-find-root directory ".git")))
- (helm-ff-default-directory (funcall helm-grep-default-directory-fn)))
- (cl-assert helm-ff-default-directory nil "Not inside a Git repository")
- (helm-do-grep-1 (if all '("") `(,(expand-file-name directory))))))
-
-\f
-;;;###autoload
-(defun helm-do-grep-ag ()
- "Preconfigured helm for grepping with AG in `default-directory'."
- (interactive)
- (require 'helm-files)
- (helm-grep-ag-1 default-directory))
-
-;;;###autoload
-(defun helm-grep-do-git-grep (arg)
- "Preconfigured helm for git-grepping `default-directory'.
-With a prefix arg ARG git-grep the whole repository."
- (interactive "P")
- (require 'helm-files)
- (helm-grep-git-1 default-directory arg))
-
-
-(provide 'helm-grep)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-grep.el ends here
+++ /dev/null
-;;; helm-help.el --- Help messages for Helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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)
-
-(defvar helm-org-headings--nofilename)
-(declare-function helm-source-org-headings-for-files "helm-org.el")
-
-\f
-(defgroup helm-help nil
- "Embedded help for `helm'."
- :group 'helm)
-
-(defface helm-helper
- '((t :inherit helm-header))
- "Face for helm help string in minibuffer."
- :group 'helm-help)
-
-(defcustom helm-documentation-file "~/.emacs.d/helm-doc.org"
- "The file where you want to save helm documentation."
- :group 'helm-help
- :type 'string)
-\f
-(defvar helm-help--string-list '(helm-help-message
- helm-buffer-help-message
- helm-ff-help-message
- helm-read-file-name-help-message
- helm-generic-file-help-message
- helm-grep-help-message
- helm-pdfgrep-help-message
- helm-etags-help-message
- helm-ucs-help-message
- helm-bookmark-help-message
- helm-esh-help-message
- helm-buffers-ido-virtual-help-message
- helm-moccur-help-message
- helm-top-help-message
- helm-apt-help-message
- helm-el-package-help-message
- helm-M-x-help-message
- helm-imenu-help-message
- helm-colors-help-message
- helm-semantic-help-message
- helm-kmacro-help-message))
-
-\f
-;;;###autoload
-(defun helm-documentation (arg)
- "Preconfigured helm for helm documentation.
-With a prefix arg refresh the documentation.
-
-Find here the documentation of all sources actually documented."
- (interactive "P")
- (require 'helm-org)
- (when arg (delete-file helm-documentation-file)
- (helm-aif (get-file-buffer helm-documentation-file)
- (kill-buffer it)))
- (unless (file-exists-p helm-documentation-file)
- (with-temp-file helm-documentation-file
- (erase-buffer)
- (cl-loop for elm in helm-help--string-list
- for str = (symbol-value elm)
- do (insert (substitute-command-keys
- (if (functionp str) (funcall str) str))
- "\n\n"))))
- (let ((helm-org-headings--nofilename t))
- (helm :sources (helm-source-org-headings-for-files
- (list helm-documentation-file))
- :candidate-number-limit 99999
- :buffer "*helm documentation*")))
-\f
-;;; Local help messages.
-
-;;; `helm-buffer-list' help
-;;
-;;
-(defvar helm-buffer-help-message
- "* Helm Buffer
-
-** Tips
-
-*** Completion
-
-**** Major-mode
-
-You can enter a partial name of major-mode (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\" will list all buffers but the ones in lisp-mode, sh-mode and
-fundamental-mode.
-
-Enter then a space and a pattern to narrow down to buffers matching this pattern.
-
-**** Search inside buffers
-
-If you enter a space and a pattern prefixed by \"@\" helm will search for text matching
-this pattern INSIDE the buffer (i.e not in the name of buffer).
-NOTE that if you enter your pattern prefixed with \"@\" but escaped, helm will search a buffer
-matching \"@pattern\" but will not search inside.
-
-**** Search by directory name
-
-If you prefix the beginning of pattern with \"/\" the match will occur on directory name
-of buffer, it is interesting to narrow down to one directory for example, subsequent string
-entered after a space will match on buffer-name only.
-Note that negation is not supported for matching on buffer-file-name.
-You can specify more than one directory starting from helm v1.6.8
-
-**** Fuzzy matching
-
-Note that if `helm-buffers-fuzzy-matching' is non--nil you will have
-fuzzy matching on buffer names (not on directory name matching and major-mode though).
-A pattern starting with \"^\" will disable fuzzy matching and will match by exact regexp.
-
-**** Examples
-
-if I enter in pattern prompt:
-
- \"*lisp ^helm @moc\"
-
-helm will narrow down the list by selecting only buffers that are in lisp mode, start by helm
-and match \"moc\" in their contents.
-
-if I enter in pattern prompt:
-
- \"*lisp ^helm moc\"
-
-Notice there is no \"@\" this time
-helm will look for lisp mode buffers starting by \"helm\" and have \"moc\" in their name.
-
-if I enter in pattern prompt:
-
- \"*!lisp !helm\"
-
-helm will narrow down to buffers that are not in \"lisp\" mode and that do not match \"helm\"
-
-if I enter in pattern prompt:
-
- /helm/ w3
-
-helm will narrow down to buffers that are in any \"helm\" subdirectory and matching w3.
-
-*** Creating buffers
-
-When creating a new buffer use \\[universal-argument] to choose a mode for your buffer in a list.
-This list is customizable, see `helm-buffers-favorite-modes'.
-
-*** Killing buffers
-
-You have a command to kill buffer(s) and quit emacs and a command to kill buffers one by one
-\(no marked\) without quitting helm.
-
-You can run this persistent kill buffer command either with the regular
-`helm-execute-persistent-action' called with a prefix arg (C-u C-j) or with its specific command
-`helm-buffer-run-kill-persistent' see binding below.
-
-*** Meaning of colors and prefixes for buffers
-
-Remote buffers are prefixed with '@'.
-Red => Buffer have its file modified on disk by an external process.
-Indianred2 => Buffer exists but its file have been deleted.
-Orange => Buffer is modified and its file not saved to disk.
-Italic => A non--file buffer.
-
-** Commands
-\\<helm-buffer-map>
-\\[helm-buffer-run-zgrep]\t\tGrep Buffer(s) works as zgrep too (C-u grep all buffers but non--file buffers).
-\\[helm-buffers-run-multi-occur]\t\tMulti Occur buffer or marked buffers. (C-u toggle force searching current-buffer).
-\\[helm-buffer-switch-other-window]\t\tSwitch other window.
-\\[helm-buffer-switch-other-frame]\t\tSwitch other frame.
-\\[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. If two marked buffers ediff those buffers.
-\\[helm-buffer-run-ediff-merge]\t\tEdiff merge current buffer with candidate. If two marked buffers ediff merge those buffers.
-\\[helm-buffer-diff-persistent]\t\tToggle Diff buffer with saved file without quitting.
-\\[helm-buffer-revert-persistent]\t\tRevert buffer without quitting.
-\\[helm-buffer-save-persistent]\t\tSave buffer without quitting.
-\\[helm-buffer-run-kill-buffers]\t\tDelete marked buffers and quit.
-\\[helm-buffer-run-kill-persistent]\t\tDelete buffer without quitting helm.
-\\[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 with same type (color) than current.")
-
-;;; Find files help (`helm-find-files')
-;;
-;;
-(defvar helm-ff-help-message
- "* Helm Find Files
-
-** Tips
-
-*** Navigation summary
-
-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.
-
-**** Use `C-j' (persistent action) on a directory to go down one level
-
-On a symlinked directory a prefix arg will allow expanding to its true name.
-
-**** Use `C-l' on a directory to go up one level
-
-**** Use `C-r' to walk back the resulting tree of all the `C-l' you did
-
-Note: The tree is reinitialized each time you enter a new tree with `C-j'
-or by entering some pattern in prompt.
-
-*** Find file at point
-
-Helm is using `ffap' partially or completely to find file at point
-depending on value of `helm-ff-guess-ffap-filenames'.
-You can use full `ffap' by setting this to non-nil (annoying).
-Default value is nil which make `ffap' working partially.
-
-**** Find file at number line
-
-With something like this at point:
-
- ~/elisp/helm/helm.el:1234
-
-Helm will find this file at line number 1234.
-
-**** Find url at point
-
-When an url is found at point, helm expand to that url only.
-Pressing RET jump to that url using `browse-url-browser-function'.
-
-**** Find mail at point
-
-When a mail address is found at point helm expand to this email address
-prefixed by \"mailto:\". Pressing RET open a message buffer with this mail
-address.
-
-*** Quick pattern expansion
-
-**** Enter `~/' at end of pattern to quickly reach home directory
-
-**** Enter `/' at end of pattern to quickly reach root of your file system
-
-**** Enter `./' at end of pattern to quickly reach `default-directory' (initial start of session)
-
-If you are already in `default-directory' this will move cursor on top.
-
-**** Enter `../' at end of pattern will reach upper directory, moving cursor on top
-
-NOTE: This is different to using `C-l' in that `C-l' don't move cursor on top but stay on previous
-subdir name.
-
-**** Enter any environment var (e.g. `$HOME') at end of pattern, it will be expanded
-
-**** You can yank any valid filename after pattern, it will be expanded
-
-*** Helm find files is fuzzy matching (start on third char entered)
-
-e.g. \"fob\" or \"fbr\" will complete \"foobar\"
-but \"fb\" will wait for a third char for completing.
-
-*** Use `C-u C-j' to watch an image or `C-<down>'
-
-*** `C-j' on a filename will expand in helm-buffer to this filename
-
-Second hit on `C-j' will display buffer filename.
-Third hit on `C-j' will kill buffer filename.
-NOTE: `C-u C-j' will display buffer directly.
-
-*** To browse images directories turn on `helm-follow-mode' and navigate with arrow keys
-
-You can also use `helm-follow-action-forward' and `helm-follow-action-backward'
-\(`C-<down' and `C-<left>').
-
-*** You can turn off/on (toggle) autoupdate completion at any moment with `C-DEL'
-
-It is useful when auto completion is enabled and when trying to create a new file
-or directory you want to prevent helm trying to complete what you are writing.
-NOTE: On a terminal C-<backspace> may not work, use in this case C-c <backspace>.
-
-*** You can create a new directory and a new file at the same time
-
-Just write the path in prompt and press `<RET>'.
-e.g. You can create \"~/new/newnew/newnewnew/my_newfile.txt\".
-
-*** To create a new directory, add a \"/\" at end of new name and press <RET>
-
-*** To create a new file just write the filename not ending with \"/\"
-
-*** Recursive search from helm find files
-
-**** You can use helm browse project (see binding below)
-
-- With no prefix arg
- If your current directory is under version control
- with one of git or hg and you have installed helm-ls-git and/or helm-ls-hg
- https://github.com/emacs-helm/helm-ls-git.git
- https://github.com/emacs-helm/helm-ls-hg
- you will see all your files under version control, otherwise
- you will be back to helm-find-files.
-- With one prefix arg
- You will see all the files under this directory
- and other subdirectories (recursion) and this list of files will be cached.
-- With two prefix args
- same but the cache will be refreshed.
-
-**** You can start a recursive search with Locate of Find (See commands below)
-
-With Locate you can use a local db with a prefix arg. If the localdb doesn't already
-exists, you will be prompted for its creation, if it exists and you want to refresh it,
-give two prefix args.
-
-*** Insert filename at point or complete filename at point
-
-On insertion (no completion, i.e nothing at point):
-
-- `C-c i' => insert absolute file name.
-- `C-u C-c i' => insert abbreviate file name.
-- `C-u C-u C-c i' => insert relative file name.
-
-On completion:
-
-- target starts by ~/ => insert abbreviate file name.
-- target starts by / or [a-z]:/ => insert full path.
-- otherwise => insert relative file name.
-
-*** Using wildcard to select multiple files
-
-Use of wilcard is supported to give a set of files to an action:
-
-e.g. You can copy all the files with \".el\" extension by using \"*.el\"
-and then run your copy action.
-
-You can do the same but with \"**.el\" (note the two stars),
-this will select recursively all \".el\" files under current directory.
-
-NOTE: When using an action that involve an external backend (e.g. grep), using \"**\"
-is not advised (even if it works fine) because it will be slower to select all your files,
-you have better time letting the backend doing it, it will be faster.
-However, if you know you have not many files it is reasonable to use this,
-also using not recursive wilcard (e.g. \"*.el\") is perfectly fine for this.
-
-This feature (\"**\") is activated by default with the option `helm-file-globstar'.
-The directory selection with \"**foo/\" like bash shopt globstar option is not supported yet.
-
-*** Copying renaming asynchronously
-
-If you use async library (if you have installed helm from MELPA you do) you can enable
-async for copying/renaming etc... your files by enabling `dired-async-mode'.
-
-Note that even when async is enabled, running a copy/rename action with a prefix arg
-will execute action synchronously, it will follow also the first file of the marked files
-in its destination directory.
-
-*** Bookmark your `helm-find-files' session
-
-You can bookmark your `helm-find-files' session with `C-x r m'.
-You can retrieve later these bookmarks easily by using M-x helm-filtered-bookmarks
-or from the current `helm-find-files' session just hitting `C-x r b'.
-
-*** Run Gid from `helm-find-files'
-
-You can navigate to a project containing an ID file created with the `mkid'
-command from id-utils, and run the `gid' command which will use the symbol at point
-in `helm-current-buffer' as default.
-
-** Commands
-\\<helm-find-files-map>
-\\[helm-ff-run-locate]\t\tRun Locate (C-u to specify locate db, M-n insert basename of candidate)
-\\[helm-ff-run-browse-project]\t\tBrowse project (`C-u' recurse, `C-u C-u' recurse and refresh db)
-\\[helm-ff-run-find-sh-command]\t\tRun Find shell command from this directory.
-\\[helm-ff-run-grep]\t\tRun Grep (C-u Recursive).
-\\[helm-ff-run-pdfgrep]\t\tRun Pdfgrep on marked files.
-\\[helm-ff-run-zgrep]\t\tRun zgrep (C-u Recursive).
-\\[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 (C-u use thing-at-point `C-u C-u' reload cache)
-\\[helm-ff-run-rename-file]\t\tRename File (C-u Follow).
-\\[helm-ff-run-query-replace-on-marked]\t\tQuery replace on marked files.
-\\[helm-ff-run-copy-file]\t\tCopy File (C-u Follow).
-\\[helm-ff-run-byte-compile-file]\t\tByte Compile File (C-u Load).
-\\[helm-ff-run-load-file]\t\tLoad File.
-\\[helm-ff-run-symlink-file]\t\tSymlink File.
-\\[helm-ff-run-hardlink-file]\t\tHardlink file.
-\\[helm-ff-run-delete-file]\t\tDelete File.
-\\[helm-ff-run-kill-buffer-persistent]\t\tKill buffer candidate without quitting.
-\\[helm-ff-persistent-delete]\t\tDelete file without quitting.
-\\[helm-ff-run-switch-to-eshell]\t\tSwitch to Eshell.
-\\[helm-ff-run-eshell-command-on-file]\t\tEshell command on file (C-u 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 other window.
-\\[helm-ff-run-switch-other-frame]\t\tSwitch other frame.
-\\[helm-ff-run-open-file-externally]\t\tOpen file with external program (C-u to choose).
-\\[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 down precedent directory.
-\\[helm-ff-run-switch-to-history]\t\tSwitch to last visited directories 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 visibles candidates.
-\\[helm-ff-run-toggle-auto-update]\t\tToggle auto expansion of directories.
-\\[helm-unmark-all]\t\tUnmark all candidates, visibles and invisibles.
-\\[helm-ff-run-gnus-attach-files]\t\tGnus attach files to message buffer.
-\\[helm-ff-run-print-file]\t\tPrint file, (C-u to refresh printers 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.")
-
-;;; Help for `helm-read-file-name'
-;;
-;;
-(defvar helm-read-file-name-help-message
- "* Helm read file name
-
-** Tips
-
-If you are here, you are probably using a vanilla command like `find-file'
-helmized by `helm-mode', this is cool, but it is even better for your file
-navigation to use `helm-find-files' which is fully featured.
-
-*** Navigation
-
-**** Enter `~/' at end of pattern to quickly reach home directory
-
-**** Enter `/' at end of pattern to quickly reach root of your file system
-
-**** Enter `./' at end of pattern to quickly reach `default-directory' (initial start of session)
-
-If you are in `default-directory' move cursor on top.
-
-**** Enter `../' at end of pattern will reach upper directory, moving cursor on top
-
-NOTE: This different to using `C-l' in that `C-l' don't move cursor on top but stay on previous
-subdir name.
-
-**** You can complete with partial basename (start on third char entered)
-
-E.g. \"fob\" or \"fbr\" will complete \"foobar\"
-but \"fb\" will wait for a third char for completing.
-
-*** Persistent actions
-
-By default `helm-read-file-name' use the persistent actions of `helm-find-files'
-
-**** Use `C-u C-j' to watch an image
-
-**** `C-j' on a filename will expand in helm-buffer to this filename
-
-Second hit on `C-j' will display buffer filename.
-Third hit on `C-j' will kill buffer filename.
-NOTE: `C-u C-j' will display buffer directly.
-
-**** To browse images directories turn on `helm-follow-mode' and navigate with arrow keys
-
-*** Delete characters backward
-
-When you want to delete backward characters, e.g. to create a new file or directory,
-autoupdate may keep updating to an existent directory preventing you from doing so.
-In this case, type 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 C-<backspace> may not work, use in this case C-c <backspace>.
-
-*** Create new directory and files
-
-**** 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,
-just write the path in prompt and press <RET>.
-E.g. You can create \"~/new/newnew/newnewnew/my_newfile.txt\".
-
-**** To create a new directory, add a \"/\" at end of new name and press <RET>
-
-**** To create a new file just write the filename not ending with \"/\"
-
-_NOTE_: File and directory creation work only in some commands (e.g `find-file')
-and will not work in other commands where it is not intended to return a file or a directory
-\(e.g `list-directory').
-
-** Commands
-\\<helm-read-file-map>
-\\[helm-find-files-up-one-level]\t\tGo down precedent 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\tMaybe return empty string (unless `must-match').
-\\[helm-next-source]\t\tGoto next source.
-\\[helm-previous-source]\t\tGoto previous source.")
-
-;;; Generic file help - Used by locate.
-;;
-;;
-(defvar helm-generic-file-help-message
- "* Helm Generic files
-
-** Tips
-
-*** Locate
-
-You can add after writing search pattern any of the locate command line options.
-e.g. -b, -e, -n <number>...etc.
-See Man locate for more infos.
-
-Some other sources (at the moment recentf and file in current directory sources)
-support the -b flag for compatibility with locate when they are used with it.
-
-*** Browse project
-
-When your directory is not under version control,
-don't forget to refresh your cache when files have been added/removed in your directory.
-
-*** Find command
-
-Recursively search files using \"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 options directly to find after a \"*\" separator.
-For example, this would find all files matching \"book\" that are larger
-than 1 megabyte:
-
- book * -size +1M
-
-** Commands
-\\<helm-generic-files-map>
-\\[helm-ff-run-toggle-basename]\t\tToggle basename.
-\\[helm-ff-run-grep]\t\tRun grep (C-u recurse).
-\\[helm-ff-run-zgrep]\t\tRun zgrep.
-\\[helm-ff-run-gid]\t\tRun gid (id-utils).
-\\[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 file(s) (C-u load) (elisp).
-\\[helm-ff-run-load-file]\t\tLoad file(s) (elisp).
-\\[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 other window.
-\\[helm-ff-properties-persistent]\t\tShow file properties.
-\\[helm-ff-run-etags]\t\tRun etags (C-u use tap, C-u C-u reload DB).
-\\[helm-yank-text-at-point]\t\tYank text at point.
-\\[helm-ff-run-open-file-externally]\t\tOpen file with external program (C-u 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.")
-
-;;; Grep help
-;;
-;;
-(defvar helm-grep-help-message
- "* Helm Grep
-
-** Tips
-
-*** You can start grep with a prefix arg to recurse in subdirectories
-
-*** You can use wild card when selecting files (e.g. *.el)
-
-*** You can grep in many differents directories by marking files or wild cards
-
-*** You can save your results in a `helm-grep-mode' buffer, see commands below
-
-Once in this buffer you can use emacs-wgrep to edit your changes.
-
-*** Important
-
-Grepping on remote file will work only with grep, not ack-grep, but it is
-anyway bad supported as tramp doesn't support multiple process running in a
-short delay (less than 5s actually) among other things,
-so I strongly advice hitting `C-!' (i.e suspend process)
-before entering anything in pattern, and hit again `C-!' when
-your regexp is ready to send to remote process, even if helm is handling
-this by delaying each process at 5s.
-Or even better don't use tramp at all and mount your remote file system on SSHFS.
-
-* Helm Gid
-
-** Tips
-
-Helm gid read 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.
-You have access to this command also from `helm-find-files' which allow you to
-navigate to another directory to consult its database.
-
-* Helm AG
-
-** Tips
-
-Helm AG is different from grep or ack-grep in that it works on a directory and not
-a list of files.
-You can ignore files and directories by using a \".agignore\" file, local to directory
-or global when placed in home directory (See AG man page for more infos).
-This file supports same entries as what you will find in `helm-grep-ignored-files' and
-`helm-grep-ignored-directories'.
-As always you can access helm AG from `helm-find-files'.
-
-** Commands
-\\<helm-grep-map>
-\\[helm-goto-next-file]\t\tNext File.
-\\[helm-goto-precedent-file]\t\tPrecedent File.
-\\[helm-yank-text-at-point]\t\tYank Text at point in minibuffer.
-\\[helm-grep-run-other-window-action]\t\tJump other window.
-\\[helm-grep-run-other-frame-action]\t\tJump 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.")
-
-;;; Pdf grep help
-;;
-;;
-(defvar helm-pdfgrep-help-message
- "* Helm PdfGrep Map
-
-** Commands
-\\<helm-pdfgrep-map>
-\\[helm-goto-next-file]\t\tNext File.
-\\[helm-goto-precedent-file]\t\tPrecedent File.
-\\[helm-yank-text-at-point]\t\tYank Text at point in minibuffer.")
-
-;;; Etags help
-;;
-;;
-(defvar helm-etags-help-message
- "* Helm Etags Map
-
-** Commands
-\\<helm-etags-map>
-\\[helm-goto-next-file]\t\tNext File.
-\\[helm-goto-precedent-file]\t\tPrecedent File.
-\\[helm-yank-text-at-point]\t\tYank Text at point in minibuffer.")
-
-;;; Ucs help
-;;
-;;
-(defvar helm-ucs-help-message
- "* Helm Ucs
-
-** Tips
-
-Use commands below to insert unicode characters
-in current-buffer without quitting helm.
-
-** Commands
-\\<helm-ucs-map>
-\\[helm-ucs-persistent-insert]\t\tInsert char.
-\\[helm-ucs-persistent-forward]\t\tForward char.
-\\[helm-ucs-persistent-backward]\t\tBackward char.
-\\[helm-ucs-persistent-delete]\t\tDelete char backward.")
-
-;;; Bookmark help
-;;
-;;
-(defvar helm-bookmark-help-message
- "* Helm bookmark name
-
-** 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.")
-
-;;; Eshell command on file help
-;;
-;;
-(defvar helm-esh-help-message
- "* Helm eshell on file
-
-** Tips
-
-*** Passing extra args after filename
-
-Normally your command or alias will be called with file as argument. E.g.,
-
- <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 your command will look at this:
-
- <command> 'candidate_file' [extra_args]
-
-*** Specify many files as args (marked files)
-
-E.g. <command> file1 file2 ...
-
-Call `helm-find-files-eshell-command-on-file' with one prefix-arg
-Otherwise you can pass one prefix-arg from the command selection buffer.
-NOTE: This is not working on remote files.
-
-With two prefix-arg before starting or from the command selection buffer
-the output is printed to your `current-buffer'.
-
-Note that with no prefix-arg or a prefix-arg value of '(16) (C-u C-u)
-the command is called once for each file like this:
-
- <command> file1 <command> file2 etc...
-
-** Commands
-\\<helm-esh-on-file-map>")
-
-;;; Ido virtual buffer help
-;;
-;;
-(defvar helm-buffers-ido-virtual-help-message
- "* Helm ido virtual buffers
-
-** Commands
-\\<helm-buffers-ido-virtual-map>
-\\[helm-ff-run-switch-other-window]\t\tSwitch other window.
-\\[helm-ff-run-switch-other-frame]\t\tSwitch 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.")
-
-;;; Moccur help
-;;
-;;
-(defvar helm-moccur-help-message
- "* Helm Moccur
-
-** Tips
-
-*** Matching
-
-Multiple regexp matching is allowed, just enter a space to separate your regexps.
-
-Matching empty lines is supported with the regexp \"^$\", you will get the results
-with only the buffer-name and the line number, you can of course save and edit these
-results (i.e add text to the empty line) .
-
-*** Automatically matching symbol at point
-
-You can match automatically the symbol at point, but keeping
-the minibuffer empty ready to write into.
-This is disabled by default, to enable this you have to add `helm-source-occur'
-and `helm-source-moccur' to `helm-sources-using-default-as-input'.
-
-*** Jump to the corresponding line in the searched buffer
-
-You can do this with `C-j' (persistent-action), to do it repetitively
-you can use `C-<up>' and `C-<down>' or enable `helm-follow-mode' with `C-c C-f'.
-
-*** Saving results
-
-Same as with helm-grep, you can save the results with `C-x C-s'.
-Of course if you don't save your results, you can get back your session
-with `helm-resume'.
-
-*** Refreshing the resumed session.
-
-When the buffer(s) where you ran helm-(m)occur have been modified, you will be
-warned of this with the buffer flashing to red, you can refresh the buffer by running
-`C-c C-u'.
-This can be done automatically by customizing `helm-moccur-auto-update-on-resume'.
-
-*** Refreshing a saved buffer
-
-Type `g' to update your buffer.
-
-*** Edit a saved buffer
-
-First, install wgrep https://github.com/mhayashi1120/Emacs-wgrep
-and then:
-
-1) C-c C-p to edit the buffer(s).
-2) C-x C-s to save your changes.
-
-Tip: Use the excellent iedit https://github.com/tsdh/iedit
-to modify occurences in your buffer.
-
-** Commands
-\\<helm-moccur-map>
-\\[helm-goto-next-file]\t\tNext Buffer.
-\\[helm-goto-precedent-file]\t\tPrecedent Buffer.
-\\[helm-yank-text-at-point]\t\tYank Text at point in minibuffer.
-\\[helm-moccur-run-goto-line-ow]\t\tGoto line in other window.
-\\[helm-moccur-run-goto-line-of]\t\tGoto line in new frame.")
-
-;;; Helm Top
-;;
-;;
-(defvar helm-top-help-message
- "* Helm Top
-
-** Tips
-
-** 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.")
-
-;;; Helm Apt
-;;
-;;
-(defvar helm-apt-help-message
- "* Helm Apt
-
-** Tips
-
-** Commands
-\\<helm-apt-map>
-\\[helm-apt-show-all]\t\tShow all packages.
-\\[helm-apt-show-only-installed]\t\tShow installed packages only.
-\\[helm-apt-show-only-not-installed]\t\tShow not installed packages only.
-\\[helm-apt-show-only-deinstalled]\t\tShow deinstalled (not purged yet) packages only.>")
-
-;;; Helm elisp package
-;;
-;;
-(defvar helm-el-package-help-message
- "* Helm elisp package
-
-** Tips
-
-*** Compile all your packages asynchronously
-
-When using async (if you have installed from MELPA you do), only helm, helm-core,
-and magit are compiled asynchronously, if you want all your packages compiled async,
-add to your init file:
-
- (setq async-bytecomp-allowed-packages '(all))
-
-*** Upgrade elisp packages
-
-On initial start (when emacs is fetching packages on remote), if helm find
-package to upgrade it will start in the upgradables packages view showing the packages
-availables to upgrade.
-On further starts, you will have to refresh the list with `C-c C-u', if helm find upgrades
-you will have a message telling you some packages are available for upgrade, you can switch to
-upgrade view (see below) to see what packages are available for upgrade or just hit `C-c U'.
-to upgrade all.
-
-To see upgradables packages hit <M-U>.
-
-Then you can install all upgradables packages with the upgrade all action (`C-c C-u'),
-or upgrade only the specific packages by marking them (the new ones) and running
-the upgrade action (visible only when there is upgradables packages).
-Of course you can upgrade a single package by just running the upgrade action
-without marking it (`C-c u' or RET) .
-
-\*WARNING* You are strongly advised to RESTART emacs after UPGRADING packages.
-
-*** Meaning of flags prefixing packages (Emacs-25)
-
-- The flag \"S\" that prefix package names mean that this package is one of `package-selected-packages'.
-This feature is only available with emacs-25.
-
-- The flag \"U\" that prefix package names mean that this package is no more needed.
-This feature is only available with emacs-25.
-
-** 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 not installed packages only.
-\\[helm-el-package-show-upgrade]\t\tShow upgradable 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 upgradables.
-\\[helm-el-run-visit-homepage]\t\tVisit package homepage.")
-
-;;; Helm M-x
-;;
-;;
-(defvar helm-M-x-help-message
- "* Helm M-x
-
-** Tips
-
-*** You can get help on any command with persistent action (C-j)
-
-*** Prefix Args
-
-All the prefix args passed BEFORE running `helm-M-x' are ignored,
-you should get an error message if you do so.
-When you want to pass prefix args, pass them AFTER starting `helm-M-x',
-you will see a prefix arg counter appearing in mode-line notifying you
-the number of prefix args entered.")
-
-;;; helm-imenu
-;;
-;;
-(defvar helm-imenu-help-message
- "* Helm imenu
-
-** Tips
-
-** Commands
-\\<helm-imenu-map>
-\\[helm-imenu-next-section]\t\tGo to next section.
-\\[helm-imenu-previous-section]\t\tGo to previous section.")
-
-;;; helm-colors
-;;
-;;
-(defvar helm-colors-help-message
- "* Helm colors
-
-** Commands
-\\<helm-color-map>
-\\[helm-color-run-insert-name]\t\tInsert the entry'name.
-\\[helm-color-run-kill-name]\t\tKill the entry's name.
-\\[helm-color-run-insert-rgb]\t\tInsert entry in RGB format.
-\\[helm-color-run-kill-rgb]\t\tKill entry in RGB format.")
-
-;;; helm semantic
-;;
-;;
-(defvar helm-semantic-help-message
- "* Helm semantic
-
-** Tips
-
-** Commands
-\\<helm-semantic-map>")
-
-;;; helm kmacro
-;;
-;;
-(defvar helm-kmacro-help-message
- "* Helm kmacro
-
-** Tips
-
-- Start recording some keys with `f3'
-- Record new kmacro with `f4'
-- Start `helm-execute-kmacro' to list all your macros.
-
-Use persistent action to run your kmacro as many time as needed,
-you can change of kmacro with `helm-next-line' `helm-previous-line'.
-
-NOTE: You can't record keys running helm commands except `helm-M-x' unless
-you don't choose from there a command using helm completion.
-
-** Commands
-\\<helm-kmacro-map>")
-
-\f
-;;; Mode line strings
-;;
-;;
-;;;###autoload
-(defvar helm-comp-read-mode-line "\
-\\<helm-comp-read-map>\
-C/\\[helm-cr-empty-string]:Empty \
-\\<helm-map>\
-\\[helm-help]:Help \
-\\[helm-select-action]:Act \
-\\[helm-maybe-exit-minibuffer]/\
-f1/f2/f-n:NthAct \
-\\[helm-toggle-suspend-update]:Tog.suspend")
-
-;;;###autoload
-(defvar helm-read-file-name-mode-line-string "\
-\\<helm-read-file-map>\
-\\[helm-help]:Help \
-C/\\[helm-cr-empty-string]:Empty \
-\\<helm-map>\
-\\[helm-select-action]:Act \
-\\[helm-maybe-exit-minibuffer]/\
-f1/f2/f-n:NthAct \
-\\[helm-toggle-suspend-update]:Tog.suspend"
- "String displayed in mode-line in `helm-source-find-files'.")
-
-;;;###autoload
-(defvar helm-top-mode-line "\
-\\<helm-top-map>\
-\\[helm-help]:Help \
-\\<helm-map>\
-\\[helm-select-action]:Act \
-\\[helm-maybe-exit-minibuffer]/\
-f1/f2/f-n:NthAct \
-\\[helm-toggle-suspend-update]:Tog.suspend")
-
-\f
-;;; Attribute Documentation
-;;
-;;
-;;;###autoload
-(defun helm-describe-helm-attribute (helm-attribute)
- "Display the full documentation of HELM-ATTRIBUTE.
-HELM-ATTRIBUTE should be a symbol."
- (interactive (list (intern
- (completing-read
- "Describe helm attribute: "
- (mapcar 'symbol-name helm-attributes)
- nil t))))
- (with-output-to-temp-buffer "*Help*"
- (princ (get helm-attribute 'helm-attrdoc))))
-
-(helm-document-attribute 'name "mandatory"
- " The name of the source. It is also the heading which appears
- above the list of matches from the source. Must be unique.")
-
-(helm-document-attribute 'header-name "optional"
- " 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.")
-
-(helm-document-attribute 'candidates "mandatory if candidates-in-buffer attribute is not provided"
- " 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.
-
- 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.
-
- If the candidates have to be retrieved asynchronously (for
- example, by an external command which takes a while to run)
- then the function should start the external command
- asynchronously and return the associated process object.
- Helm will take care of managing the process (receiving the
- output from it, killing it if necessary, etc.). The process
- should return candidates matching the current pattern (see
- variable `helm-pattern'.)
- You should use instead `candidates-process' attribute for
- async processes, a warning will popup when using async process
- in a `candidates' attribute.
-
- Note that currently results from asynchronous sources appear
- last in the helm buffer regardless of their position in
- `helm-sources'.")
-
-(helm-document-attribute 'candidates-process
- "Same as `candidates' attributes but for process function."
- " You should use this attribute when using a function involving
- an async process instead of `candidates'.")
-
-(helm-document-attribute 'action "mandatory if type attribute is not provided"
- " It is a list of (DISPLAY . FUNCTION) pairs or 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.")
-
-(helm-document-attribute 'coerce "optional"
- " 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)")
-
-(helm-document-attribute 'type "optional if action attribute is provided"
- " Indicates the type of the items the source returns.
-
- Merge attributes not specified in the source itself from
- `helm-type-attributes'.
-
- This attribute is implemented by plug-in.")
-
-(helm-document-attribute 'init "optional"
- " 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.
-
- For example, if a source needs to work with the current
- directory then it can store its value here, because later
- helm does its job in the minibuffer and in the
- `helm-buffer' and the current directory can be different
- there.")
-
-(helm-document-attribute 'match "optional"
- " 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').
-
- 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'), since they perform pattern matching
- themselves.")
-
-(helm-document-attribute 'candidate-transformer "optional"
- " 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.")
-
-(helm-document-attribute 'filtered-candidate-transformer "optional"
- " 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 dislpayed 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.
-
- This option has no effect for asynchronous sources. (Not yet,
- at least.")
-
-(helm-document-attribute 'action-transformer "optional"
- " 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.")
-
-(helm-document-attribute 'pattern-transformer "optional"
- " 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'.")
-
-(helm-document-attribute 'delayed "optional"
- " Candidates from the source are shown only if the user stops
- typing and is idle for `helm-idle-delay' seconds.
- If a value is given to delayed attr, this value is used instead only
- if it is > to `helm-idle-delay'.")
-
-(helm-document-attribute 'volatile "optional"
- " 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.")
-
-(helm-document-attribute 'requires-pattern "optional"
- " 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.")
-
-(helm-document-attribute 'persistent-action "optional"
- " 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.")
-
-(helm-document-attribute 'candidates-in-buffer "optional"
- " Shortcut attribute for making and narrowing candidates using
- buffers. This newly-introduced attribute prevents us from
- forgetting to add volatile and match attributes.
-
- See docstring of `helm-candidates-in-buffer'.
-
- (candidates-in-buffer) is equivalent of three attributes:
- (candidates . helm-candidates-in-buffer)
- (volatile)
- (match identity)
-
- (candidates-in-buffer . candidates-function) is equivalent of:
- (candidates . candidates-function)
- (volatile)
- (match identity)
-
- This attribute is implemented by plug-in.")
-
-(helm-document-attribute 'search "optional"
- " 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'. This attribute is meant to be used with
- (candidates . helm-candidates-in-buffer) or
- (candidates-in-buffer) in short.")
-
-(helm-document-attribute 'get-line "optional"
- " A function like `buffer-substring-no-properties' or `buffer-substring'.
- This function converts point of line-beginning and point of line-end,
- which represents a candidate computed by `helm-candidates-in-buffer'.
- By default, `helm-candidates-in-buffer' uses
- `buffer-substring-no-properties'.")
-
-(helm-document-attribute 'display-to-real "optional"
- " Function called with one parameter; the selected candidate.
-
- The function transforms the selected candidate, and the result
- is passed to the action function. The display-to-real
- attribute provides another way to pass other string than one
- shown in Helm buffer.
-
- Traditionally, it is possible to make candidates,
- candidate-transformer or filtered-candidate-transformer
- function return a list with (DISPLAY . REAL) pairs. But if REAL
- can be generated from DISPLAY, display-to-real is more
- convenient and faster.")
-
-(helm-document-attribute 'real-to-display "optional"
- " Function called with one parameter; the selected candidate.
-
- The inverse of display-to-real attribute.
-
- The function transforms the selected candidate, which is passed
- to the action function, for display. The real-to-display
- attribute provides the other way to pass other string than one
- shown in Helm buffer.
-
- Traditionally, it is possible to make candidates,
- candidate-transformer or filtered-candidate-transformer
- function return a list with (DISPLAY . REAL) pairs. But if
- DISPLAY can be generated from REAL, real-to-display is more
- convenient.
-
- Note that DISPLAY parts returned from candidates /
- candidate-transformer are IGNORED as the name `display-to-real'
- says.")
-
-(helm-document-attribute 'cleanup "optional"
- " 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.")
-
-(helm-document-attribute 'candidate-number-limit "optional"
- " Override `helm-candidate-number-limit' only for this source.")
-
-(helm-document-attribute 'accept-empty "optional"
- " Pass empty string \"\" to action function.")
-
-(helm-document-attribute 'dummy "optional"
- " Set `helm-pattern' to candidate. If this attribute is
- specified, The candidates attribute is ignored.
-
- This attribute is implemented by plug-in.")
-
-(helm-document-attribute 'multiline "optional"
- " Enable to selection multiline candidates.")
-
-(helm-document-attribute 'update "optional"
- (substitute-command-keys
- " Function called with no parameters at before \"init\" function when \
-\\<helm-map>\\[helm-force-update] is pressed."))
-
-(helm-document-attribute 'mode-line "optional"
- " Source local `helm-mode-line-string' (included in
- `mode-line-format'). It accepts also variable/function name.")
-
-(helm-document-attribute 'header-line "optional"
- " Source local `header-line-format'.
- It accepts also variable/function name. ")
-
-(helm-document-attribute
- 'resume "optional"
- " 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.")
-
-(helm-document-attribute 'keymap "optional"
- " Specific keymap for this source.
- It is useful to have a keymap per source when using more than
- one source. Otherwise, a keymap can be set per command with
- `helm' argument KEYMAP. NOTE: when a source have `helm-map' as
- keymap attr, the global value of `helm-map' will override the
- actual local one.")
-
-(helm-document-attribute 'help-message "optional"
- " Help message for this source.
- If not present, `helm-help-message' value will be used.")
-
-(helm-document-attribute 'match-part "optional"
- " Allow matching candidate in the line with `candidates-in-buffer'.
- In candidates-in-buffer sources, match is done with
- `re-search-forward' which allow matching only a regexp on the
- `helm-buffer'; when this search is done, match-part allow
- matching only a specific part of the current line e.g. with a
- line like this:
-
- filename:candidate-containing-the-word-filename
-
- What you want is to ignore \"filename\" part and match only
- \"candidate-containing-the-word-filename\"
-
- So give a function matching only the part of candidate after \":\"
-
- 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.
-
- NOTE: This have effect only on sources using
- `candidates-in-buffer'.")
-
-(helm-document-attribute 'match-strict "optional"
- " 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. For anonymous
- function don't add the dot, e.g:
-
- \(match-strict (lambda () (foo))).")
-
-(helm-document-attribute 'nohighlight "optional"
- " Disable highlight match in this source.")
-
-(helm-document-attribute 'no-matchplugin "optional"
- " Disable matchplugin for this source.")
-
-(helm-document-attribute 'history "optional"
- " Allow passing history variable to helm from source.
- It should be a quoted symbol evaluated from source, i.e:
- (history . ,'history-var)")
-
-(helm-document-attribute 'follow "optional"
- " Enable `helm-follow-mode' for this source only.
- You must give it a value of 1 or -1, though giving a -1 value
- is surely not what you want, e.g: (follow . 1)
-
- See `helm-follow-mode' for more infos")
-
-(helm-document-attribute 'follow-delay "optional"
- " `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'.")
-
-(helm-document-attribute 'allow-dups "optional"
- " Allow helm collecting duplicates candidates.")
-
-(helm-document-attribute 'filter-one-by-one "optional"
- " 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 `candidates-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 `candidates-transformer'
- these functions should treat the candidates transformed by the `filter-one-by-one'
- function in consequence.")
-
-(helm-document-attribute 'nomark "optional"
- " Don't allow marking candidates when this attribute is present.")
-
-(provide 'helm-help)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-help.el ends here
+++ /dev/null
-;;; helm-id-utils.el --- Helm interface for id-utils. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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-grep)
-(require 'helm-help)
-
-(defgroup helm-id-utils nil
- "ID-Utils related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-gid-program "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'."
- :group 'helm-id-utils
- :type 'file)
-
-(defcustom helm-gid-db-file-name "ID"
- "Name of a database file created by `mkid' command from `ID-utils'."
- :group 'helm-id-utils
- :type 'string)
-
-(defun helm-gid-candidates-process ()
- (let ((proc (start-process
- "gid" nil helm-gid-program
- "-r" helm-pattern)))
- (set (make-local-variable 'helm-grep-last-cmd-line)
- (format "%s -r %s" helm-gid-program helm-pattern))
- (prog1 proc
- (set-process-sentinel
- proc (lambda (_process event)
- (when (string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format "[Helm Gid process finished - (%s results)]"
- (max (1- (count-lines
- (point-min) (point-max)))
- 0))
- 'face 'helm-locate-finish))))
- (force-mode-line-update))
- (helm-log "Error: Gid %s"
- (replace-regexp-in-string "\n" "" event))))))))
-
-(defun helm-gid-filtered-candidate-transformer (candidates _source)
- ;; "gid -r" may add dups in some rare cases.
- (cl-loop for c in (helm-fast-remove-dups candidates :test 'equal)
- collect (helm-grep--filter-candidate-1 c)))
-
-(defclass helm-gid-source (helm-source-async)
- ((header-name
- :initform
- (lambda (name)
- (concat name " [" (helm-attr 'db-dir) "]")))
- (db-dir :initarg :db-dir
- :initform nil
- :custom string
- :documentation " Location of ID file.")
- (candidates-process :initform #'helm-gid-candidates-process)
- (filtered-candidate-transformer
- :initform #'helm-gid-filtered-candidate-transformer)
- (candidate-number-limit :initform 99999)
- (action :initform (helm-make-actions
- "Find File" 'helm-grep-action
- "Find file other frame" 'helm-grep-other-frame
- (lambda () (and (locate-library "elscreen")
- "Find file in Elscreen"))
- 'helm-grep-jump-elscreen
- "Save results in grep buffer" 'helm-grep-save-results
- "Find file other window" 'helm-grep-other-window))
- (persistent-action :initform 'helm-grep-persistent-action)
- (history :initform 'helm-grep-history)
- (nohighlight :initform t)
- (help-message :initform 'helm-grep-help-message)
- (requires-pattern :initform 2)))
-
-;;;###autoload
-(defun helm-gid ()
- "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/>."
- (interactive)
- (let* ((db (locate-dominating-file
- default-directory
- helm-gid-db-file-name))
- (helm-grep-default-directory-fn
- (lambda () default-directory))
- (helm--maybe-use-default-as-input t))
- (cl-assert db nil "No DataBase found, create one with `mkid'")
- (helm :sources (helm-make-source "Gid" 'helm-gid-source
- :db-dir db)
- :buffer "*helm gid*"
- :keymap helm-grep-map
- :truncate-lines helm-grep-truncate-lines)))
-
-(provide 'helm-id-utils)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-id-utils ends here
+++ /dev/null
-;;; helm-imenu.el --- Helm interface for Imenu -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'imenu)
-(require 'helm-utils)
-(require 'helm-help)
-
-\f
-(defgroup helm-imenu nil
- "Imenu related libraries and applications for helm."
- :group 'helm)
-
-(defcustom helm-imenu-delimiter " / "
- "Delimit types of candidates and his value in `helm-buffer'."
- :group 'helm-imenu
- :type 'string)
-
-(defcustom helm-imenu-execute-action-at-once-if-one
- #'helm-imenu--execute-action-at-once-p
- "Goto the candidate when only one is remaining."
- :group 'helm-imenu
- :type 'function)
-
-(defcustom helm-imenu-lynx-style-map t
- "Use Arrow keys to jump to occurences."
- :group 'helm-imenu
- :type 'boolean)
-
-\f
-;;; keymap
-(defvar helm-imenu-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-imenu-next-section)
- (define-key map (kbd "M-<up>") 'helm-imenu-previous-section)
- (when helm-imenu-lynx-style-map
- (define-key map (kbd "<left>") 'helm-maybe-exit-minibuffer)
- (define-key map (kbd "<right>") 'helm-execute-persistent-action))
- (delq nil map)))
-
-(defun helm-imenu-next-or-previous-section (n)
- (with-helm-buffer
- (let* ((fn (lambda ()
- (car (split-string (helm-get-selection nil t)
- helm-imenu-delimiter))))
- (curtype (funcall fn))
- (move-fn (if (> n 0) #'helm-next-line #'helm-previous-line))
- (stop-fn (if (> n 0)
- #'helm-end-of-source-p
- #'helm-beginning-of-source-p)))
- (catch 'break
- (while (not (funcall stop-fn))
- (funcall move-fn)
- (unless (string= curtype (funcall fn))
- (throw 'break nil)))))))
-
-(defun helm-imenu-next-section ()
- (interactive)
- (helm-imenu-next-or-previous-section 1))
-
-(defun helm-imenu-previous-section ()
- (interactive)
- (helm-imenu-next-or-previous-section -1))
-
-\f
-;;; Internals
-(defvar helm-cached-imenu-alist nil)
-(make-variable-buffer-local 'helm-cached-imenu-alist)
-
-(defvar helm-cached-imenu-candidates nil)
-(make-variable-buffer-local 'helm-cached-imenu-candidates)
-
-(defvar helm-cached-imenu-tick nil)
-(make-variable-buffer-local 'helm-cached-imenu-tick)
-
-\f
-(defvar helm-source-imenu nil "See (info \"(emacs)Imenu\")")
-(defvar helm-source-imenu-all nil)
-
-(defclass helm-imenu-source (helm-source-sync)
- ((candidates :initform 'helm-imenu-candidates)
- (candidate-transformer :initform 'helm-imenu-transformer)
- (persistent-action :initform 'helm-imenu-persistent-action)
- (persistent-help :initform "Show this entry")
- (keymap :initform helm-imenu-map)
- (help-message :initform 'helm-imenu-help-message)
- (action :initform 'helm-imenu-action)))
-
-(defcustom helm-imenu-fuzzy-match nil
- "Enable fuzzy matching in `helm-source-imenu'."
- :group 'helm-imenu
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-imenu
- (helm-make-source "Imenu" 'helm-imenu-source
- :fuzzy-match helm-imenu-fuzzy-match))))
-\f
-(defun helm-imenu--maybe-switch-to-buffer (candidate)
- (helm-aif (marker-buffer (cdr candidate))
- (switch-to-buffer it)))
-
-(defun helm-imenu--execute-action-at-once-p ()
- (let ((cur (helm-get-selection))
- (mb (with-helm-current-buffer
- (save-excursion
- (goto-char (point-at-bol))
- (point-marker)))))
- (if (equal (cdr cur) mb)
- (prog1 nil
- (helm-set-pattern "")
- (helm-force-update))
- t)))
-
-(defun helm-imenu-action (candidate)
- "Default action for `helm-source-imenu'."
- (helm-log-run-hook 'helm-goto-line-before-hook)
- (helm-imenu--maybe-switch-to-buffer candidate)
- (imenu candidate)
- ;; If semantic is supported in this buffer
- ;; imenu used `semantic-imenu-goto-function'
- ;; and position have been highlighted,
- ;; no need to highlight again.
- (unless (eq imenu-default-goto-function
- 'semantic-imenu-goto-function)
- (helm-highlight-current-line nil nil nil nil 'pulse)))
-
-(defun helm-imenu-persistent-action (candidate)
- "Default persistent action for `helm-source-imenu'."
- (helm-imenu--maybe-switch-to-buffer candidate)
- (imenu candidate)
- (helm-highlight-current-line))
-
-(defun helm-imenu-candidates (&optional buffer)
- (with-current-buffer (or buffer helm-current-buffer)
- (let ((tick (buffer-modified-tick)))
- (if (eq helm-cached-imenu-tick tick)
- helm-cached-imenu-candidates
- (setq imenu--index-alist nil)
- (prog1 (setq helm-cached-imenu-candidates
- (let ((index (imenu--make-index-alist t)))
- (helm-imenu--candidates-1
- (delete (assoc "*Rescan*" index) index))))
- (setq helm-cached-imenu-tick tick))))))
-
-(defun helm-imenu-candidates-in-all-buffers ()
- (let* ((lst (buffer-list))
- (progress-reporter (make-progress-reporter
- "Imenu indexing buffers..." 1 (length lst))))
- (prog1
- (cl-loop for b in lst
- for count from 1
- for mm = (with-current-buffer b major-mode)
- for cmm = (with-helm-current-buffer major-mode)
- when (or (with-helm-current-buffer
- (derived-mode-p mm))
- (with-current-buffer b
- (derived-mode-p cmm)))
- do (progress-reporter-update progress-reporter count)
- and
- append (with-current-buffer b
- (helm-imenu-candidates b)))
- (progress-reporter-done progress-reporter))))
-
-(defun helm-imenu--candidates-1 (alist)
- (cl-loop for elm in alist
- nconc (if (imenu--subalist-p elm)
- (helm-imenu--candidates-1
- (cl-loop for (e . v) in (cdr elm) collect
- (cons (propertize
- e 'helm-imenu-type (car elm))
- ;; 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].
- (if (integerp v) (copy-marker v) v))))
- (and (cdr elm) ; bug in imenu, should not be needed.
- (setcdr elm (copy-marker (cdr elm))) ; Same as [1].
- (list elm)))))
-
-(defun helm-imenu--get-prop (item)
- ;; property value of ITEM can have itself
- ;; a property value which have itself a property value
- ;; ...and so on; Return a list of all these
- ;; properties values starting at ITEM.
- (let* ((prop (get-text-property 0 'helm-imenu-type item))
- (lst (list prop item)))
- (when prop
- (while prop
- (setq prop (get-text-property 0 'helm-imenu-type prop))
- (and prop (push prop lst)))
- lst)))
-
-(defun helm-imenu-transformer (candidates)
- (cl-loop for (k . v) in candidates
- for types = (or (helm-imenu--get-prop k)
- (list "Function" k))
- for bufname = (buffer-name (marker-buffer v))
- for disp1 = (mapconcat
- (lambda (x)
- (propertize
- x 'face (cond ((string= x "Variables")
- 'font-lock-variable-name-face)
- ((string= x "Function")
- 'font-lock-function-name-face)
- ((string= x "Types")
- 'font-lock-type-face))))
- types helm-imenu-delimiter)
- for disp = (propertize disp1 'help-echo bufname)
- collect
- (cons disp (cons k v))))
-\f
-;;;###autoload
-(defun helm-imenu ()
- "Preconfigured `helm' for `imenu'."
- (interactive)
- (unless helm-source-imenu
- (setq helm-source-imenu
- (helm-make-source "Imenu" 'helm-imenu-source
- :fuzzy-match helm-imenu-fuzzy-match)))
- (let ((imenu-auto-rescan t)
- (str (thing-at-point 'symbol))
- (helm-execute-action-at-once-if-one
- helm-imenu-execute-action-at-once-if-one))
- (helm :sources 'helm-source-imenu
- :default (list (concat "\\_<" str "\\_>") str)
- :preselect str
- :buffer "*helm imenu*")))
-
-;;;###autoload
-(defun helm-imenu-in-all-buffers ()
- "Preconfigured helm for fetching imenu entries of all buffers."
- (interactive)
- (unless helm-source-imenu-all
- (setq helm-source-imenu-all
- (helm-make-source "Imenu in all buffers" 'helm-imenu-source
- :candidates 'helm-imenu-candidates-in-all-buffers
- :fuzzy-match helm-imenu-fuzzy-match)))
- (let ((imenu-auto-rescan t)
- (str (thing-at-point 'symbol))
- (helm-execute-action-at-once-if-one
- helm-imenu-execute-action-at-once-if-one))
- (helm :sources 'helm-source-imenu-all
- :default (list (concat "\\_<" str "\\_>") str)
- :preselect (unless (memq 'helm-source-imenu-all
- helm-sources-using-default-as-input)
- str)
- :buffer "*helm imenu all*")))
-
-(provide 'helm-imenu)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-imenu.el ends here
+++ /dev/null
-;;; helm-info.el --- Browse info index with helm -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-lib)
-(require 'helm-plugin)
-(require 'info)
-
-(declare-function Info-index-nodes "info" (&optional file))
-(declare-function Info-goto-node "info" (&optional fork))
-(declare-function Info-find-node "info.el" (filename nodename &optional no-going-back))
-(defvar Info-history)
-(defvar Info-directory-list)
-\f
-;;; Customize
-
-(defgroup helm-info nil
- "Info-related applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-info-default-sources
- '(helm-source-info-elisp
- helm-source-info-cl
- helm-source-info-eieio
- helm-source-info-pages)
- "Default sources to use for looking up symbols at point in Info
-files with `helm-info-at-point'."
- :group 'helm-info
- :type '(repeat (choice symbol)))
-\f
-;;; Build info-index sources with `helm-info-source' class.
-
-(cl-defun helm-info-init (&optional (file (helm-attr 'info-file)))
- ;; Allow reinit candidate buffer when using edebug.
- (helm-aif (and debug-on-error
- (helm-candidate-buffer))
- (kill-buffer it))
- (unless (helm-candidate-buffer)
- (save-window-excursion
- (info file)
- (let ((tobuf (helm-candidate-buffer 'global))
- (infobuf (current-buffer))
- Info-history
- start end)
- (cl-dolist (node (Info-index-nodes))
- (Info-goto-node node)
- (goto-char (point-min))
- (while (search-forward "\n* " nil t)
- (unless (search-forward "Menu:\n" (1+ (point-at-eol)) t)
- (setq start (point-at-bol)
- end (point-at-eol))
- (with-current-buffer tobuf
- (insert-buffer-substring infobuf start end)
- (insert "\n")))))))))
-
-(defun helm-info-goto (node-line)
- (Info-goto-node (car node-line))
- (helm-goto-line (cdr node-line)))
-
-(defun helm-info-display-to-real (line)
- (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))
- (string-to-number (or (match-string 3 line) "1")))))
-
-(defclass helm-info-source (helm-source-in-buffer)
- ((info-file :initarg :info-file
- :initform nil
- :custom 'string)
- (init :initform #'helm-info-init)
- (display-to-real :initform #'helm-info-display-to-real)
- (get-line :initform #'buffer-substring)
- (action :initform '(("Goto node" . helm-info-goto)))))
-
-(defmacro helm-build-info-source (fname &rest args)
- `(helm-make-source (concat "Info Index: " ,fname) 'helm-info-source
- :info-file ,fname ,@args))
-
-(defun helm-build-info-index-command (name doc source buffer)
- "Define a helm command NAME with documentation DOC.
-Arg SOURCE will be an existing helm source named
-`helm-source-info-<NAME>' and BUFFER a string buffer name."
- (defalias (intern (concat "helm-info-" name))
- (lambda ()
- (interactive)
- (helm :sources source
- :buffer buffer
- :candidate-number-limit 1000))
- doc))
-
-(defun helm-define-info-index-sources (var-value &optional commands)
- "Define helm sources named helm-source-info-<NAME>.
-Sources are generated for all entries of `helm-default-info-index-list'.
-If COMMANDS arg is non-nil, also build commands named `helm-info-<NAME>'.
-Where NAME is an element of `helm-default-info-index-list'."
- (cl-loop for str in var-value
- for sym = (intern (concat "helm-source-info-" str))
- do (set sym (helm-build-info-source str))
- when commands
- do (helm-build-info-index-command
- str (format "Predefined helm for %s info." str)
- sym (format "*helm info %s*" str))))
-
-(defun helm-info-index-set (var value)
- (set var value)
- (helm-define-info-index-sources value t))
-\f
-;;; Search Info files
-
-;; `helm-info' is the main entry point here. It prompts the user for an Info
-;; file, then a term in the file's index to jump to.
-
-(defvar helm-info-searched (make-ring 32)
- "Ring of previously searched Info files.")
-
-(defun helm-get-info-files ()
- "Return list of Info files to use for `helm-info'.
-
-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'."
- (let ((files (cl-loop for d in (or Info-directory-list
- Info-default-directory-list)
- when (file-directory-p d)
- append (directory-files d nil "\\.info"))))
- (helm-fast-remove-dups
- (cl-loop for f in files collect
- (helm-file-name-sans-extension f))
- :test 'equal)))
-
-(defcustom helm-default-info-index-list
- (helm-get-info-files)
- "Info files to search in with `helm-info'."
- :group 'helm-info
- :type '(repeat (choice string))
- :set 'helm-info-index-set)
-
-(defun helm-info-search-index (candidate)
- "Search the index of CANDIDATE's Info file using the function
-helm-info-<CANDIDATE>."
- (let ((helm-info-function
- (intern-soft (concat "helm-info-" candidate))))
- (when (fboundp helm-info-function)
- (funcall helm-info-function)
- (ring-insert helm-info-searched candidate))))
-
-(defun helm-def-source--info-files ()
- "Return a `helm' source for Info files."
- (helm-build-sync-source "Helm Info"
- :candidates
- (lambda () (copy-sequence helm-default-info-index-list))
- :candidate-number-limit 999
- :candidate-transformer
- (lambda (candidates)
- (sort candidates #'string-lessp))
- :nomark t
- :action '(("Search index" . helm-info-search-index))))
-
-;;;###autoload
-(defun helm-info ()
- "Preconfigured `helm' for searching Info files' indices."
- (interactive)
- (let ((default (unless (ring-empty-p helm-info-searched)
- (ring-ref helm-info-searched 0))))
- (helm :sources (helm-def-source--info-files)
- :buffer "*helm Info*"
- :preselect (and default
- (concat "\\_<" (regexp-quote default) "\\_>")))))
-\f
-;;;; Info at point
-
-;; `helm-info-at-point' is the main entry point here. It searches for the
-;; symbol at point through the Info sources defined in
-;; `helm-info-default-sources' and jumps to it.
-
-(defvar helm-info--pages-cache nil
- "Cache for all Info pages on the system.")
-
-(defvar helm-source-info-pages
- (helm-build-sync-source "Info Pages"
- :init #'helm-info-pages-init
- :candidates (lambda () helm-info--pages-cache)
- :action '(("Show with Info" .(lambda (node-str)
- (info (replace-regexp-in-string
- "^[^:]+: " "" node-str)))))
- :requires-pattern 2)
- "Helm source for Info pages.")
-
-(defun helm-info-pages-init ()
- "Collect candidates for initial Info node Top."
- (if helm-info--pages-cache
- helm-info--pages-cache
- (let ((info-topic-regexp "\\* +\\([^:]+: ([^)]+)[^.]*\\)\\.")
- topics)
- (with-temp-buffer
- (Info-find-node "dir" "top")
- (goto-char (point-min))
- (while (re-search-forward info-topic-regexp nil t)
- (push (match-string-no-properties 1) topics))
- (kill-buffer))
- (setq helm-info--pages-cache topics))))
-
-;;;###autoload
-(defun helm-info-at-point ()
- "Preconfigured `helm' for searching info at point.
-With a prefix-arg insert symbol at point."
- (interactive)
- (helm :sources helm-info-default-sources
- :buffer "*helm info*"))
-\f
-(provide 'helm-info)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-info.el ends here
+++ /dev/null
-;;; helm-locate.el --- helm interface for locate. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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/>.
-
-;; NOTE for WINDOZE users:
-;; You have to install Everything with his command line interface here:
-;; http://www.voidtools.com/download.php
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'helm)
-(require 'helm-types)
-(require 'helm-help)
-
-\f
-(defgroup helm-locate nil
- "Locate related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-locate-db-file-regexp "m?locate\.db$"
- "Default regexp to match locate database.
-If nil Search in all files."
- :type 'string
- :group 'helm-locate)
-
-(defcustom helm-ff-locate-db-filename "locate.db"
- "The basename of the locatedb file you use locally in your directories.
-When this is set and `helm' find 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."
- :group 'helm-locate
- :type 'string)
-
-(defcustom helm-locate-command nil
- "A list of arguments for locate program.
-Normally the default value should work on any system.
-
-If nil it will be calculated when `helm-locate' startup
-with these default values for different systems:
-
-Gnu/linux: \"locate %s -e --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 \"-r\" option must be the last option, however if not specified you will
-be able to specify it during helm invocation by prefixing the pattern
-you enter with \"-r\"."
- :type 'string
- :group 'helm-locate)
-
-(defcustom helm-locate-create-db-command
- "updatedb -l 0 -o %s -U %s"
- "Command used to create a locale locate db file."
- :type 'string
- :group 'helm-locate)
-
-(defcustom helm-locate-case-fold-search helm-case-fold-search
- "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."
- :group 'helm-locate
- :type 'symbol)
-
-(defcustom helm-locate-fuzzy-match nil
- "Enable fuzzy matching in `helm-locate'."
- :group 'helm-locate
- :type 'boolean)
-
-(defcustom helm-locate-project-list nil
- "A list of directories, your projects.
-When set, allow browsing recursively files in all
-directories of this list with `helm-projects-find-files'."
- :group 'helm-locate
- :type '(repeat string))
-
-\f
-(defvar helm-generic-files-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "C-]") 'helm-ff-run-toggle-basename)
- (define-key map (kbd "C-s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g s") 'helm-ff-run-grep)
- (define-key map (kbd "M-g z") 'helm-ff-run-zgrep)
- (define-key map (kbd "M-g p") 'helm-ff-run-pdfgrep)
- (define-key map (kbd "C-c g") 'helm-ff-run-gid)
- (define-key map (kbd "M-R") 'helm-ff-run-rename-file)
- (define-key map (kbd "M-C") 'helm-ff-run-copy-file)
- (define-key map (kbd "M-B") 'helm-ff-run-byte-compile-file)
- (define-key map (kbd "M-L") 'helm-ff-run-load-file)
- (define-key map (kbd "M-S") 'helm-ff-run-symlink-file)
- (define-key map (kbd "M-H") 'helm-ff-run-hardlink-file)
- (define-key map (kbd "M-D") 'helm-ff-run-delete-file)
- (define-key map (kbd "C-=") 'helm-ff-run-ediff-file)
- (define-key map (kbd "C-c =") 'helm-ff-run-ediff-merge-file)
- (define-key map (kbd "C-c o") 'helm-ff-run-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-ff-run-switch-other-frame)
- (define-key map (kbd "M-i") 'helm-ff-properties-persistent)
- (define-key map (kbd "C-c C-x") 'helm-ff-run-open-file-externally)
- (define-key map (kbd "C-c X") 'helm-ff-run-open-file-with-default-tool)
- (define-key map (kbd "M-.") 'helm-ff-run-etags)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- (define-key map (kbd "C-c @") 'helm-ff-run-insert-org-link)
- map)
- "Generic Keymap for files.")
-
-\f
-(defface helm-locate-finish
- '((t (:foreground "Green")))
- "Face used in mode line when locate process is finish."
- :group 'helm-locate)
-
-\f
-(defun helm-ff-find-locatedb (&optional from-ff)
- "Try to find if a local locatedb file is available.
-The search is done in `helm-ff-default-directory' or
-fall back to `default-directory' if FROM-FF is nil."
- (when helm-ff-locate-db-filename
- (cond ((and helm-ff-default-directory
- from-ff
- (file-exists-p (expand-file-name
- helm-ff-locate-db-filename
- helm-ff-default-directory))
- (expand-file-name
- helm-ff-locate-db-filename
- helm-ff-default-directory)))
- ((and (not from-ff)
- (file-exists-p (expand-file-name
- helm-ff-locate-db-filename
- default-directory))
- (expand-file-name
- helm-ff-locate-db-filename
- default-directory))))))
-
-
-(defun helm-locate-create-db-default-function (db-name directory)
- "Default function used to create a locale locate db file.
-Argument DB-NAME name of the db file.
-Argument DIRECTORY root of file system subtree to scan."
- (format helm-locate-create-db-command db-name directory))
-
-(defvar helm-locate-create-db-function
- #'helm-locate-create-db-default-function
- "Function used to create a locale locate db file.
-It should receive the same arguments as
-`helm-locate-create-db-default-function'.")
-
-(defun helm-locate-1 (&optional localdb init from-ff default)
- "Generic function to run Locate.
-Prefix arg LOCALDB when (4) search and use a local locate db file when it
-exists or create it, when (16) force update of existing db file
-even if exists.
-It have no effect when locate command is 'es'.
-INIT is a string to use as initial input in prompt.
-See `helm-locate-with-db' and `helm-locate'."
- (require 'helm-mode)
- (helm-locate-set-command)
- (let ((pfn (lambda (candidate)
- (if (file-directory-p candidate)
- (message "Error: The locate Db should be a file")
- (if (= (shell-command
- (funcall helm-locate-create-db-function
- candidate
- helm-ff-default-directory))
- 0)
- (message "New locatedb file `%s' created" candidate)
- (error "Failed to create locatedb file `%s'" candidate)))))
- (locdb (and localdb
- (not (string-match "^es" helm-locate-command))
- (or (and (equal '(4) localdb)
- (helm-ff-find-locatedb from-ff))
- (helm-read-file-name
- "Create Locate Db file: "
- :initial-input (expand-file-name "locate.db"
- (or helm-ff-default-directory
- default-directory))
- :preselect helm-locate-db-file-regexp
- :test (lambda (x)
- (if helm-locate-db-file-regexp
- ;; Select only locate db files and directories
- ;; to allow navigation.
- (or (string-match
- helm-locate-db-file-regexp x)
- (file-directory-p x))
- x)))))))
- (when (and locdb (or (equal localdb '(16))
- (not (file-exists-p locdb))))
- (funcall pfn locdb))
- (helm-locate-with-db (and localdb locdb) init default)))
-
-(defun helm-locate-set-command ()
- "Setup `helm-locate-command' if not already defined."
- (unless helm-locate-command
- (setq helm-locate-command
- (cl-case system-type
- (gnu/linux "locate %s -e --regex %s")
- (berkeley-unix "locate %s %s")
- (windows-nt "es %s %s")
- (t "locate %s %s")))))
-
-(defvar helm-file-name-history nil)
-(defun helm-locate-with-db (&optional db initial-input default)
- "Run locate -d DB.
-If DB is not given or nil use locate without -d option.
-Argument DB can be given as a string or list of db files.
-Argument INITIAL-INPUT is a string to use as initial-input.
-See also `helm-locate'."
- (require 'helm-files)
- (when (and db (stringp db)) (setq db (list db)))
- (helm-locate-set-command)
- (let ((helm-locate-command
- (if db
- (replace-regexp-in-string
- "locate"
- (format "locate -d %s"
- (mapconcat 'identity
- ;; Remove eventually
- ;; marked directories by error.
- (cl-loop for i in db
- unless (file-directory-p i)
- collect i) ":"))
- helm-locate-command)
- helm-locate-command)))
- (setq helm-file-name-history (mapcar 'helm-basename file-name-history))
- (helm :sources 'helm-source-locate
- :buffer "*helm locate*"
- :ff-transformer-show-only-basename nil
- :input initial-input
- :default default
- :history 'helm-file-name-history)))
-
-(defun helm-locate-init ()
- "Initialize async locate process for `helm-source-locate'."
- (let* ((locate-is-es (string-match "\\`es" helm-locate-command))
- (real-locate (string-match "\\`locate" helm-locate-command))
- (case-sensitive-flag (if locate-is-es "-i" ""))
- (ignore-case-flag (if (or locate-is-es
- (not real-locate)) "" "-i"))
- (args (split-string helm-pattern " "))
- (cmd (format helm-locate-command
- (cl-case helm-locate-case-fold-search
- (smart (let ((case-fold-search nil))
- (if (string-match "[[:upper:]]" helm-pattern)
- case-sensitive-flag
- ignore-case-flag)))
- (t (if helm-locate-case-fold-search
- ignore-case-flag
- case-sensitive-flag)))
- (concat
- ;; The pattern itself.
- (shell-quote-argument (car args)) " "
- ;; Possible locate args added
- ;; after pattern, don't quote them.
- (mapconcat 'identity (cdr args) " ")))))
- (helm-log "Starting helm-locate process")
- (helm-log "Command line used was:\n\n%s"
- (concat ">>> " (propertize cmd 'face 'font-lock-comment-face) "\n\n"))
- (prog1
- (start-process-shell-command
- "locate-process" helm-buffer
- cmd)
- (set-process-sentinel
- (get-buffer-process helm-buffer)
- (lambda (process event)
- (let* ((err (process-exit-status process))
- (noresult (= err 1)))
- (cond (noresult
- (with-helm-buffer
- (unless (cdr helm-sources)
- (insert (concat "* Exit with code 1, no result found,"
- " command line was:\n\n "
- cmd)))))
- ((string= event "finished\n")
- (with-helm-window
- (setq mode-line-format
- '(" " mode-line-buffer-identification " "
- (:eval (format "L%s" (helm-candidate-number-at-point))) " "
- (:eval (propertize
- (format "[Locate process finished - (%s results)]"
- (max (1- (count-lines
- (point-min) (point-max)))
- 0))
- 'face 'helm-locate-finish))))
- (force-mode-line-update)))
- (t
- (helm-log "Error: Locate %s"
- (replace-regexp-in-string "\n" "" event))))))))))
-
-(defclass helm-locate-source (helm-source-async helm-type-file)
- ((init :initform 'helm-locate-set-command)
- (candidates-process :initform 'helm-locate-init)
- (requires-pattern :initform 3)
- (history :initform 'helm-file-name-history)
- (persistent-action :initform 'helm-ff-kill-or-find-buffer-fname)
- (candidate-number-limit :initform 9999)))
-
-(defvar helm-source-locate
- (helm-make-source "Locate" 'helm-locate-source
- :pattern-transformer 'helm-locate-pattern-transformer))
-
-(defun helm-locate-pattern-transformer (pattern)
- (if helm-locate-fuzzy-match
- (cond ((string-match
- " " (replace-regexp-in-string " -b" "" pattern)) pattern)
- ((string-match "\\([^ ]*\\) -b" pattern)
- (concat (helm--mapconcat-pattern
- (match-string 1 pattern)) " -b"))
- (t (helm--mapconcat-pattern pattern)))
- pattern))
-
-(defun helm-locate-find-dbs-in-projects (&optional update)
- (let* ((pfn (lambda (candidate directory)
- (unless (= (shell-command
- (funcall helm-locate-create-db-function
- candidate
- directory))
- 0)
- (error "Failed to create locatedb file `%s'" candidate)))))
- (cl-loop for p in helm-locate-project-list
- for db = (expand-file-name
- helm-ff-locate-db-filename
- (file-name-as-directory p))
- if (and (null update) (file-exists-p db))
- collect db
- else do (funcall pfn db p)
- and collect db)))
-
-;;;###autoload
-(defun helm-projects-find-files (update)
- "Find files with locate in `helm-locate-project-list'.
-With a prefix arg refresh the database in each project."
- (interactive "P")
- (helm-locate-set-command)
- (cl-assert (and (string-match-p "\\`locate" helm-locate-command)
- (executable-find "updatedb"))
- nil "Unsupported locate version")
- (let ((dbs (helm-locate-find-dbs-in-projects update)))
- (if dbs
- (helm-locate-with-db dbs)
- (user-error "No projects found, please setup `helm-locate-project-list'"))))
-
-;;;###autoload
-(defun helm-locate-read-file-name (prompt)
- (let* ((src `((name . "Locate read fname")
- (init . helm-locate-set-command)
- (candidates-process . helm-locate-init)
- (action . identity)
- (requires-pattern . 3)
- (history . ,'helm-file-name-history)
- (candidate-transformer . (helm-skip-boring-files
- helm-highlight-files))
- (candidate-number-limit . 9999)
- (no-matchplugin))))
- (or (helm :sources src
- :ff-transformer-show-only-basename nil
- :prompt prompt
- :buffer "*helm locate read fname*"
- :resume 'noresume)
- (keyboard-quit))))
-
-;;;###autoload
-(defun 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'."
- (interactive "P")
- (setq helm-ff-default-directory default-directory)
- (helm-locate-1 arg nil nil (thing-at-point 'filename)))
-
-(provide 'helm-locate)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-locate.el ends here
+++ /dev/null
-;;; helm-man.el --- Man and woman UI -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-
-(defvar woman-topic-all-completions)
-(defvar woman-manpath)
-(defvar woman-path)
-(defvar woman-expanded-directory-path)
-(declare-function woman-file-name "woman.el" (topic &optional re-cache))
-(declare-function woman-file-name-all-completions "woman.el" (topic))
-(declare-function Man-getpage-in-background "man.el" (topic))
-(declare-function woman-expand-directory-path "woman.el" (path-dirs path-regexps))
-(declare-function woman-topic-all-completions "woman.el" (path))
-(declare-function helm-generic-sort-fn "helm-utils.el" (S1 S2))
-
-(defgroup helm-man nil
- "Man and Woman applications for helm."
- :group 'helm)
-
-(defcustom helm-man-or-woman-function 'Man-getpage-in-background
- "Default command to display a man page."
- :group 'helm-man
- :type '(radio :tag "Preferred command to display a man page"
- (const :tag "Man" Man-getpage-in-background)
- (const :tag "Woman" woman)))
-
-(defcustom helm-man-format-switches "-l %s"
- "Arguments to pass to the `manual-entry' function.
-Arguments are passed to `manual-entry' with `format.'
-Default use \"-l\" which may not be supported on old man versions,
-in this case use \"%s\" as value to pass only the filename as argument.
-See Issue #1035"
- :group 'helm-man
- :type 'string)
-
-;; Internal
-(defvar helm-man--pages nil
- "All man pages on system.
-Will be calculated the first time you invoke helm with this
-source.")
-
-(defun helm-man-default-action (candidate)
- "Default action for jumping to a woman or man page from helm."
- (let ((wfiles (mapcar
- 'car (woman-file-name-all-completions candidate))))
- (condition-case nil
- (if (> (length wfiles) 1)
- (let ((file (helm-comp-read
- "ManFile: " wfiles :must-match t)))
- (if (eq helm-man-or-woman-function 'Man-getpage-in-background)
- (manual-entry (format helm-man-format-switches file))
- (woman-find-file file)))
- (funcall helm-man-or-woman-function candidate))
- ;; If woman is unable to format correctly
- ;; use man instead.
- (error (kill-buffer) ; Kill woman buffer.
- (Man-getpage-in-background candidate)))))
-
-(defun helm-man--init ()
- (require 'woman)
- (require 'helm-utils)
- (unless helm-man--pages
- (setq woman-expanded-directory-path
- (woman-expand-directory-path woman-manpath woman-path))
- (setq woman-topic-all-completions
- (woman-topic-all-completions woman-expanded-directory-path))
- (setq helm-man--pages (mapcar 'car woman-topic-all-completions)))
- (helm-init-candidates-in-buffer 'global helm-man--pages))
-
-(defvar helm-source-man-pages
- (helm-build-in-buffer-source "Manual Pages"
- :init #'helm-man--init
- :persistent-action #'ignore
- :filtered-candidate-transformer
- (lambda (candidates _source)
- (sort candidates #'helm-generic-sort-fn))
- :action '(("Display Man page" . helm-man-default-action))))
-
-;;;###autoload
-(defun helm-man-woman (arg)
- "Preconfigured `helm' for Man and Woman pages.
-With a prefix arg reinitialize the cache."
- (interactive "P")
- (when arg (setq helm-man--pages nil))
- (helm :sources 'helm-source-man-pages
- :buffer "*Helm man woman*"))
-
-(provide 'helm-man)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-man.el ends here
+++ /dev/null
-;;; helm-misc.el --- Various functions for helm -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-types)
-
-(declare-function display-time-world-display "time.el")
-(defvar display-time-world-list)
-
-\f
-(defgroup helm-misc nil
- "Various Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-time-zone-home-location "Paris"
- "The time zone of your home"
- :group 'helm-misc
- :type 'string)
-
-(defcustom helm-timezone-actions
- '(("Set timezone env (TZ)" . (lambda (candidate)
- (setenv "TZ" candidate))))
- "Actions for helm-timezone."
- :group 'helm-misc
- :type '(alist :key-type string :value-type function))
-
-(defcustom helm-mini-default-sources '(helm-source-buffers-list
- helm-source-recentf
- helm-source-buffer-not-found)
- "Default sources list used in `helm-mini'."
- :group 'helm-misc
- :type '(repeat (choice symbol)))
-
-(defface helm-time-zone-current
- '((t (:foreground "green")))
- "Face used to colorize current time in `helm-world-time'."
- :group 'helm-misc)
-
-(defface helm-time-zone-home
- '((t (:foreground "red")))
- "Face used to colorize home time in `helm-world-time'."
- :group 'helm-misc)
-
-
-\f
-;;; Latex completion
-(defvar LaTeX-math-menu)
-(defun helm-latex-math-candidates ()
- "Collect candidates for latex math completion."
- (cl-loop for i in (cddr LaTeX-math-menu)
- for elm = (cl-loop for s in i when (vectorp s)
- collect (cons (aref s 0) (aref s 1)))
- append elm))
-
-(defvar helm-source-latex-math
- '((name . "Latex Math Menu")
- (init . (lambda ()
- (with-helm-current-buffer
- (LaTeX-math-mode 1))))
- (candidate-number-limit . 9999)
- (candidates . helm-latex-math-candidates)
- (action . (lambda (candidate)
- (call-interactively candidate)))))
-
-\f
-;;; Jabber Contacts (jabber.el)
-(defun helm-jabber-online-contacts ()
- "List online Jabber contacts."
- (with-no-warnings
- (cl-loop for item in (jabber-concat-rosters)
- when (get item 'connected)
- collect
- (if (get item 'name)
- (cons (get item 'name) item)
- (cons (symbol-name item) item)))))
-
-(defvar helm-source-jabber-contacts
- '((name . "Jabber Contacts")
- (init . (lambda () (require 'jabber)))
- (candidates . (lambda () (mapcar 'car (helm-jabber-online-contacts))))
- (action . (lambda (x)
- (jabber-chat-with
- (jabber-read-account)
- (symbol-name
- (cdr (assoc x (helm-jabber-online-contacts)))))))))
-
-;;; World time
-;;
-(defun helm-time-zone-transformer (candidates _source)
- (cl-loop for i in candidates
- for (z . p) in display-time-world-list
- collect
- (cons
- (cond ((string-match (format-time-string "%H:%M" (current-time)) i)
- (propertize i 'face 'helm-time-zone-current))
- ((string-match helm-time-zone-home-location i)
- (propertize i 'face 'helm-time-zone-home))
- (t i))
- z)))
-
-(defvar helm-source-time-world
- (helm-build-in-buffer-source "Time World List"
- :data (lambda ()
- (with-temp-buffer
- (display-time-world-display display-time-world-list)
- (buffer-string)))
- :action 'helm-timezone-actions
- :filtered-candidate-transformer 'helm-time-zone-transformer))
-
-;;; LaCarte
-;;
-;;
-(declare-function lacarte-get-overall-menu-item-alist "ext:lacarte.el" (&optional MAPS))
-
-(defun helm-lacarte-candidate-transformer (cands)
- (mapcar (lambda (cand)
- (let* ((item (car cand))
- (match (string-match "[^>] \\((.*)\\)$" item)))
- (when match
- (put-text-property (match-beginning 1) (match-end 1)
- 'face 'helm-M-x-key item))
- cand))
- cands))
-
-(defclass helm-lacarte (helm-source-sync helm-type-command)
- ((init :initform (lambda () (require 'lacarte)))
- (candidates :initform 'helm-lacarte-get-candidates)
- (candidate-transformer :initform 'helm-lacarte-candidate-transformer)
- (candidate-number-limit :initform 9999)))
-
-(defun helm-lacarte-get-candidates (&optional maps)
- "Extract candidates for menubar using lacarte.el.
-See http://www.emacswiki.org/cgi-bin/wiki/download/lacarte.el.
-Optional argument MAPS is a list specifying which keymaps to use: it
-can contain the symbols `local', `global', and `minor', mean the
-current local map, current global map, and all current minor maps."
- (with-helm-current-buffer
- ;; FIXME: do we still need to remove possible '(nil) candidates.
- (lacarte-get-overall-menu-item-alist maps)))
-
-;;;###autoload
-(defun helm-browse-menubar ()
- "Preconfigured helm to the menubar using lacarte.el."
- (interactive)
- (require 'lacarte)
- (helm :sources (mapcar
- (lambda (spec) (helm-make-source (car spec) 'helm-lacarte
- :candidates (lambda () (helm-lacarte-get-candidates (cdr spec)))))
- '(("Major Mode" . (local))
- ("Minor Modes" . (minor))
- ("Global Map" . (global))))
- :buffer "*helm lacarte*"))
-
-(defun helm-call-interactively (cmd-or-name)
- "Execute CMD-OR-NAME as Emacs command.
-It is added to `extended-command-history'.
-`helm-current-prefix-arg' is used as the command's prefix argument."
- (setq extended-command-history
- (cons (helm-stringify cmd-or-name)
- (delete (helm-stringify cmd-or-name) extended-command-history)))
- (let ((current-prefix-arg helm-current-prefix-arg)
- (cmd (helm-symbolify cmd-or-name)))
- (if (stringp (symbol-function cmd))
- (execute-kbd-macro (symbol-function cmd))
- (setq this-command cmd)
- (call-interactively cmd))))
-
-;;; Minibuffer History
-;;
-;;
-(defvar helm-source-minibuffer-history
- (helm-build-sync-source "Minibuffer History"
- :header-name (lambda (name)
- (format "%s (%s)" name minibuffer-history-variable))
- :candidates
- (lambda ()
- (let ((history (cl-loop for i in
- (symbol-value minibuffer-history-variable)
- unless (string= "" i) collect i)))
- (if (consp (car history))
- (mapcar 'prin1-to-string history)
- history)))
- :migemo t
- :multiline t
- :action (lambda (candidate)
- (delete-minibuffer-contents)
- (insert candidate))))
-
-;;; Shell history
-;;
-;;
-(defun helm-comint-input-ring-action (candidate)
- "Default action for comint history."
- (with-helm-current-buffer
- (delete-region (comint-line-beginning-position) (point-max))
- (insert candidate)))
-
-(defvar helm-source-comint-input-ring
- '((name . "Comint history")
- (candidates . (lambda ()
- (with-helm-current-buffer
- (ring-elements comint-input-ring))))
- (action . helm-comint-input-ring-action))
- "Source that provide helm completion against `comint-input-ring'.")
-
-\f
-;;; Helm ratpoison UI
-;;
-;;
-(defvar helm-source-ratpoison-commands
- '((name . "Ratpoison Commands")
- (init . helm-ratpoison-commands-init)
- (candidates-in-buffer)
- (action ("Execute the command" . helm-ratpoison-commands-execute))
- (display-to-real . helm-ratpoison-commands-display-to-real)
- (candidate-number-limit)))
-
-(defun helm-ratpoison-commands-init ()
- (unless (helm-candidate-buffer)
- (with-current-buffer (helm-candidate-buffer 'global)
- ;; with ratpoison prefix key
- (save-excursion
- (call-process "ratpoison" nil (current-buffer) nil "-c" "help"))
- (while (re-search-forward "^\\([^ ]+\\) \\(.+\\)$" nil t)
- (replace-match "<ratpoison> \\1: \\2"))
- (goto-char (point-max))
- ;; direct binding
- (save-excursion
- (call-process "ratpoison" nil (current-buffer) nil "-c" "help top"))
- (while (re-search-forward "^\\([^ ]+\\) \\(.+\\)$" nil t)
- (replace-match "\\1: \\2")))))
-
-(defun helm-ratpoison-commands-display-to-real (display)
- (and (string-match ": " display)
- (substring display (match-end 0))))
-
-(defun helm-ratpoison-commands-execute (candidate)
- (call-process "ratpoison" nil nil nil "-ic" candidate))
-
-;;; Helm stumpwm UI
-;;
-;;
-(defvar helm-source-stumpwm-commands
- '((name . "Stumpwm Commands")
- (init . helm-stumpwm-commands-init)
- (candidates-in-buffer)
- (action ("Execute the command" . helm-stumpwm-commands-execute))
- (candidate-number-limit)))
-
-(defun helm-stumpwm-commands-init ()
- (with-current-buffer (helm-candidate-buffer 'global)
- (save-excursion
- (call-process "stumpish" nil (current-buffer) nil "commands"))
- (while (re-search-forward "[ ]*\\([^ ]+\\)[ ]*\n?" nil t)
- (replace-match "\n\\1\n"))
- (delete-blank-lines)
- (sort-lines nil (point-min) (point-max))
- (goto-char (point-max))))
-
-(defun helm-stumpwm-commands-execute (candidate)
- (call-process "stumpish" nil nil nil candidate))
-
-;;;###autoload
-(defun helm-world-time ()
- "Preconfigured `helm' to show world time.
-Default action change TZ environment variable locally to emacs."
- (interactive)
- (helm-other-buffer 'helm-source-time-world "*helm world time*"))
-
-;;;###autoload
-(defun helm-insert-latex-math ()
- "Preconfigured helm for latex math symbols completion."
- (interactive)
- (helm-other-buffer 'helm-source-latex-math "*helm latex*"))
-
-;;;###autoload
-(defun helm-ratpoison-commands ()
- "Preconfigured `helm' to execute ratpoison commands."
- (interactive)
- (helm-other-buffer 'helm-source-ratpoison-commands
- "*helm ratpoison commands*"))
-
-;;;###autoload
-(defun helm-stumpwm-commands()
- "Preconfigured helm for stumpwm commands."
- (interactive)
- (helm-other-buffer 'helm-source-stumpwm-commands
- "*helm stumpwm commands*"))
-
-;;;###autoload
-(defun helm-minibuffer-history ()
- "Preconfigured `helm' for `minibuffer-history'."
- (interactive)
- (let ((enable-recursive-minibuffers t))
- (helm :sources 'helm-source-minibuffer-history
- :buffer "*helm minibuffer-history*")))
-
-;;;###autoload
-(defun helm-comint-input-ring ()
- "Preconfigured `helm' that provide completion of `comint' history."
- (interactive)
- (when (derived-mode-p 'comint-mode)
- (helm :sources 'helm-source-comint-input-ring
- :input (buffer-substring-no-properties (comint-line-beginning-position)
- (point-at-eol))
- :buffer "*helm comint history*")))
-
-
-(provide 'helm-misc)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-misc.el ends here
+++ /dev/null
-;;; helm-mode.el --- Enable helm completion everywhere. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-files)
-
-\f
-(defgroup helm-mode nil
- "Enable helm completion."
- :group 'helm)
-
-(defcustom helm-completing-read-handlers-alist
- '((describe-function . helm-completing-read-symbols)
- (describe-variable . helm-completing-read-symbols)
- (describe-symbol . helm-completing-read-symbols)
- (debug-on-entry . helm-completing-read-symbols)
- (find-function . helm-completing-read-symbols)
- (disassemble . helm-completing-read-symbols)
- (trace-function . helm-completing-read-symbols)
- (trace-function-foreground . helm-completing-read-symbols)
- (trace-function-background . helm-completing-read-symbols)
- (find-tag . helm-completing-read-with-cands-in-buffer)
- (ffap-alternate-file . nil)
- (tmm-menubar . nil)
- (find-file . nil)
- (execute-extended-command . nil))
- "Alist of handlers to replace `completing-read', `read-file-name' in `helm-mode'.
-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 an helm function that take 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.
-This function prefix name must start by \"helm\".
-
-See `helm-completing-read-symbols' for example.
-
-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' complete against symbols and
-second `completing-read' should handle only buffer,
-your specialized function should handle the both.
-
-If the value of an entry is nil completion will fall back to
-emacs vanilla behavior.
-e.g If you want to disable helm completion for `describe-function':
-\(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.
-e.g 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."
- :group 'helm-mode
- :type '(alist :key-type symbol :value-type symbol))
-
-(defcustom helm-comp-read-case-fold-search helm-case-fold-search
- "Default Local setting of `helm-case-fold-search' for `helm-comp-read'.
-See `helm-case-fold-search' for more info."
- :group 'helm-mode
- :type 'symbol)
-
-(defcustom helm-mode-handle-completion-in-region t
- "Whether to replace or not `completion-in-region-function'.
-This enable support for `completing-read-multiple' and `completion-at-point'
-when non--nil."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-mode-reverse-history t
- "Display history source after current source in `helm-mode' handled commands."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-mode-no-completion-in-region-in-modes nil
- "A list of modes that do not want helm for `completion-in-region'."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-completion-in-region-fuzzy-match nil
- "Whether `helm-completion-in-region' use fuzzy matching or not.
-Affect among others `completion-at-point', `completing-read-multiple'."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-mode-fuzzy-match nil
- "Enable fuzzy matching in `helm-mode' globally.
-Note that this will slow down completion and modify sorting
-which is unwanted in many places.
-This affect only the functions with completing-read helmized by helm-mode.
-To fuzzy match `completion-at-point' and friends see
-`helm-completion-in-region-fuzzy-match'."
- :group 'helm-mode
- :type 'boolean)
-
-(defcustom helm-mode-minibuffer-setup-hook-black-list '(minibuffer-completion-help)
- "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'."
- :group 'helm-mode
- :type '(repeat (choice symbol)))
-
-\f
-(defvar helm-comp-read-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "<C-return>") 'helm-cr-empty-string)
- (define-key map (kbd "<M-RET>") 'helm-cr-empty-string)
- map)
- "Keymap for `helm-comp-read'.")
-
-(defvar helm-comp-read-must-match-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "RET")
- 'helm-confirm-and-exit-minibuffer)
- map)
- "Keymap use as must-match-map in `helm-comp-read' and `helm-read-file-name'.")
-
-\f
-;;; Internal
-;;
-;;
-;; Flag to know if `helm-pattern' have been added
-;; to candidate list in `helm-comp-read'.
-(defvar helm-cr-unknown-pattern-flag nil)
-
-\f
-;;; Helm `completing-read' replacement
-;;
-;;
-(defun helm-cr-empty-string ()
- "Return empty string."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- (lambda (_candidate)
- (identity "")))))
-(put 'helm-cr-empty-string 'helm-only t)
-
-(defun helm-mode--keyboard-quit ()
- ;; Use this instead of `keyboard-quit'
- ;; to avoid deactivating mark in current-buffer.
- (let ((debug-on-quit nil))
- (signal 'quit nil)))
-
-(cl-defun helm-comp-read-get-candidates (collection &optional test sort-fn alistp (input ""))
- "Convert COLLECTION to list removing elements that don't match TEST.
-See `helm-comp-read' about supported COLLECTION arguments.
-
-SORT-FN is a predicate to sort COLLECTION.
-
-ALISTP when non--nil will not use `all-completions' to collect
-candidates because it doesn't handle alists correctly for helm.
-i.e In `all-completions' the car of each pair is used as value.
-In helm we want to use the cdr instead like \(display . real\),
-so we return the alist as it is with no transformation by all-completions.
-
-e.g
-
-\(setq A '((a . 1) (b . 2) (c . 3)))
-==>((a . 1) (b . 2) (c . 3))
-\(helm-comp-read \"test: \" A :alistp nil
- :exec-when-only-one t
- :initial-input \"a\")
-==>\"a\" Which is not what we expect.
-
-\(helm-comp-read \"test: \" A :alistp t
- :exec-when-only-one t
- :initial-input \"1\")
-==>\"1\"
-
-See docstring of `all-completions' for more info.
-
-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) .
- (with-helm-current-buffer
- (let ((cands
- (cond ((vectorp collection)
- (all-completions input collection test))
- ((and (symbolp collection) (boundp collection)
- ;; Issue #324 history is let-bounded and given
- ;; quoted as hist argument of completing-read.
- ;; See example in `rcirc-browse-url'.
- (symbolp (symbol-value collection)))
- nil)
- ;; When collection is a symbol, most of the time
- ;; it should be a symbol used as a minibuffer-history.
- ;; The value of this symbol in this case return a list
- ;; of string which maybe are converted later as symbol
- ;; in special cases.
- ;; we treat here commandp as a special case as it return t
- ;; also with a string unless its last arg is provided.
- ;; Also, the history collections generally collect their
- ;; elements as string, so intern them to call predicate.
- ((and (symbolp collection) (boundp collection) test)
- (let ((predicate `(lambda (elm)
- (condition-case err
- (if (eq (quote ,test) 'commandp)
- (funcall (quote ,test) (intern elm))
- (funcall (quote ,test) elm))
- (wrong-type-argument
- (funcall (quote ,test) (intern elm)))))))
- (all-completions input (symbol-value collection) predicate)))
- ((and (symbolp collection) (boundp collection))
- (all-completions input (symbol-value collection)))
- ;; Normally file completion should not be handled here,
- ;; but special cases like `find-file-at-point' do it.
- ;; Handle here specially such cases.
- ((and (functionp collection) minibuffer-completing-file-name)
- (cl-loop for f in (funcall collection helm-pattern test t)
- unless (member f '("./" "../"))
- if (string-match ffap-url-regexp helm-pattern)
- collect f
- else
- collect (concat (file-name-as-directory
- (helm-basedir helm-pattern)) f)))
- ((functionp collection)
- (funcall collection input test t))
- ((and alistp test)
- (cl-loop for i in collection when (funcall test i) collect i))
- (alistp collection)
- (t (all-completions input collection test)))))
- (if sort-fn (sort cands sort-fn) cands))))
-
-(defun helm-cr-default-transformer (candidates _source)
- "Default filter candidate function for `helm-comp-read'."
- (cl-loop for c in candidates
- for cand = (if (stringp c) (replace-regexp-in-string "\\s\\" "" c) c)
- for pat = (replace-regexp-in-string "\\s\\" "" helm-pattern)
- if (and (equal cand pat) helm-cr-unknown-pattern-flag)
- collect
- (cons (concat (propertize
- " " 'display
- (propertize "[?]" 'face 'helm-ff-prefix))
- c)
- c)
- into lst
- else collect (if (and (stringp c)
- (string-match "\n" c))
- (cons (replace-regexp-in-string "\n" "->" c) c)
- c)
- into lst
- finally return (helm-fast-remove-dups lst :test 'equal)))
-
-(defun helm-comp-read--move-to-first-real-candidate ()
- (helm-aif (helm-get-selection nil 'withprop)
- (when (string= (get-text-property 0 'display it) "[?]")
- (helm-next-line))))
-
-;;;###autoload
-(cl-defun helm-comp-read (prompt collection
- &key
- test
- initial-input
- default
- preselect
- (buffer "*Helm Completions*")
- must-match
- fuzzy
- reverse-history
- (requires-pattern 0)
- history
- input-history
- (case-fold helm-comp-read-case-fold-search)
- (del-input t)
- (persistent-action nil)
- (persistent-help "DoNothing")
- (mode-line helm-comp-read-mode-line)
- help-message
- (keymap helm-comp-read-map)
- (name "Helm Completions")
- candidates-in-buffer
- exec-when-only-one
- quit-when-no-cand
- volatile
- sort
- (fc-transformer 'helm-cr-default-transformer)
- hist-fc-transformer
- marked-candidates
- nomark
- (alistp t)
- (candidate-number-limit helm-candidate-number-limit))
- "Read a string in the minibuffer, with helm completion.
-
-It is helm `completing-read' equivalent.
-
-- PROMPT is the prompt name to use.
-
-- COLLECTION can be a list, vector, obarray or hash-table.
- It can be also a function that receives three arguments:
- the values string, predicate and t. See `all-completions' for more details.
-
-Keys description:
-
-- TEST: A predicate called with one arg i.e candidate.
-
-- INITIAL-INPUT: Same as input arg in `helm'.
-
-- PRESELECT: See preselect arg of `helm'.
-
-- DEFAULT: This option is used only for compatibility with regular
- Emacs `completing-read' (Same as DEFAULT arg of `completing-read').
-
-- BUFFER: Name of helm-buffer.
-
-- MUST-MATCH: Candidate selected must be one of COLLECTION.
-
-- FUZZY: Enable fuzzy matching.
-
-- REVERSE-HISTORY: When non--nil display history source after current
- source completion.
-
-- REQUIRES-PATTERN: Same as helm attribute, default is 0.
-
-- HISTORY: A list containing specific history, default is nil.
- When it is non--nil, all elements of HISTORY are displayed in
- a special source before COLLECTION.
-
-- INPUT-HISTORY: A symbol. the minibuffer input history will be
- stored there, if nil or not provided, `minibuffer-history'
- will be used instead.
-
-- CASE-FOLD: Same as `helm-case-fold-search'.
-
-- DEL-INPUT: Boolean, when non--nil (default) remove the partial
- minibuffer input from HISTORY is present.
-
-- PERSISTENT-ACTION: A function called with one arg i.e candidate.
-
-- PERSISTENT-HELP: A string to document PERSISTENT-ACTION.
-
-- MODE-LINE: A string or list to display in mode line.
- Default is `helm-comp-read-mode-line'.
-
-- KEYMAP: A keymap to use in this `helm-comp-read'.
- (the keymap will be shared with history source)
-
-- NAME: The name related to this local source.
-
-- EXEC-WHEN-ONLY-ONE: Bound `helm-execute-action-at-once-if-one'
- to non--nil. (possibles values are t or nil).
-
-- VOLATILE: Use volatile attribute.
-
-- SORT: A predicate to give to `sort' e.g `string-lessp'
- Use this only on small data as it is ineficient.
- If you want to sort faster add a sort function to
- FC-TRANSFORMER.
- Note that FUZZY when enabled is already providing a sort function.
-
-- FC-TRANSFORMER: A `filtered-candidate-transformer' function
- or a list of functions.
-
-- HIST-FC-TRANSFORMER: A `filtered-candidate-transformer'
- function for the history source.
-
-- MARKED-CANDIDATES: If non--nil return candidate or marked candidates as a list.
-
-- NOMARK: When non--nil don't allow marking candidates.
-
-- ALISTP: \(default is non--nil\) 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.
- Argument VOLATILE have no effect when CANDIDATES-IN-BUFFER is non--nil.
-
-Any prefix args passed during `helm-comp-read' invocation will be recorded
-in `helm-current-prefix-arg', otherwise if prefix args were given before
-`helm-comp-read' invocation, the value of `current-prefix-arg' will be used.
-That's mean you can pass prefix args before or after calling a command
-that use `helm-comp-read' See `helm-M-x' for example."
-
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- (let ((action-fn `(("Sole action (Identity)"
- . (lambda (candidate)
- (if ,marked-candidates
- (helm-marked-candidates)
- (identity candidate)))))))
- ;; Assume completion have been already required,
- ;; so always use 'confirm.
- (when (eq must-match 'confirm-after-completion)
- (setq must-match 'confirm))
- (let* ((minibuffer-completion-confirm must-match)
- (must-match-map (when must-match helm-comp-read-must-match-map))
- (loc-map (if must-match-map
- (make-composed-keymap
- must-match-map (or keymap helm-map))
- (or keymap helm-map)))
- (minibuffer-completion-predicate test)
- (minibuffer-completion-table collection)
- (helm-read-file-name-mode-line-string
- (replace-regexp-in-string "helm-maybe-exit-minibuffer"
- "helm-confirm-and-exit-minibuffer"
- helm-read-file-name-mode-line-string))
- (get-candidates (lambda ()
- (let ((cands (helm-comp-read-get-candidates
- collection test sort alistp)))
- (setq helm-cr-unknown-pattern-flag nil)
- (unless (or (eq must-match t)
- (string= helm-pattern "")
- (assoc helm-pattern cands)
- (assoc (intern helm-pattern) cands)
- (member helm-pattern cands)
- (member (downcase helm-pattern) cands)
- (member (upcase helm-pattern) cands))
- (setq cands (append (list
- ;; Unquote helm-pattern
- ;; when it is added
- ;; as candidate.
- (replace-regexp-in-string
- "\\s\\" "" helm-pattern))
- cands))
- (setq helm-cr-unknown-pattern-flag t))
- ;; When DEFAULT is initially a list, candidates
- ;; come already computed with DEFAULT list appended,
- ;; and DEFAULT is set to the car of this list.
- (if (and default (not (string= default "")))
- (delq nil (cons default (delete default cands)))
- cands))))
- (history-get-candidates (lambda ()
- (let ((all (helm-comp-read-get-candidates
- history test nil alistp)))
- (when all
- (delete
- ""
- (helm-fast-remove-dups
- (if (and default (not (string= default "")))
- (delq nil (cons default
- (delete default all)))
- all)
- :test 'equal))))))
- (src-hist (helm-build-sync-source (format "%s History" name)
- :candidates history-get-candidates
- :fuzzy-match fuzzy
- :filtered-candidate-transformer
- (append '((lambda (candidates sources)
- (cl-loop for i in candidates
- ;; Input is added to history in completing-read's
- ;; and may be regexp-quoted, so unquote it.
- for cand = (replace-regexp-in-string "\\s\\" "" i)
- collect cand)))
- (and hist-fc-transformer (helm-mklist hist-fc-transformer)))
- :persistent-action persistent-action
- :persistent-help persistent-help
- :mode-line mode-line
- :help-message help-message
- :action action-fn))
- (src (helm-build-sync-source name
- :candidates get-candidates
- :filtered-candidate-transformer fc-transformer
- :requires-pattern requires-pattern
- :persistent-action persistent-action
- :persistent-help persistent-help
- :fuzzy-match fuzzy
- :mode-line mode-line
- :help-message help-message
- :action action-fn))
- (src-1 (helm-build-in-buffer-source name
- :data get-candidates
- :filtered-candidate-transformer fc-transformer
- :requires-pattern requires-pattern
- :persistent-action persistent-action
- :fuzzy-match fuzzy
- :persistent-help persistent-help
- :mode-line mode-line
- :help-message help-message
- :action action-fn))
- (src-list (list src-hist
- (if candidates-in-buffer
- src-1
- (if volatile
- (append src '((volatile)))
- src))))
- (helm-execute-action-at-once-if-one exec-when-only-one)
- (helm-quit-if-no-candidate quit-when-no-cand)
- result)
- (when nomark
- (setq src-list (cl-loop for src in src-list
- collect (cons '(nomark) src))))
- (when reverse-history (setq src-list (nreverse src-list)))
- (add-hook 'helm-after-update-hook 'helm-comp-read--move-to-first-real-candidate)
- (unwind-protect
- (setq result (helm
- :sources src-list
- :input initial-input
- :default default
- :preselect preselect
- :prompt prompt
- :resume 'noresume
- :candidate-number-limit candidate-number-limit
- :case-fold-search case-fold
- :keymap loc-map
- :history (and (symbolp input-history) input-history)
- :buffer buffer))
- (remove-hook 'helm-after-update-hook 'helm-comp-read--move-to-first-real-candidate))
- ;; 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.
- ;; 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.
- (setcar history result))
- (t ; Possibly a symbol with a nil value.
- (set history (list result)))))
- (or
- result
- (when (and (eq helm-exit-status 0)
- (eq must-match 'confirm))
- ;; Return empty string only if it is the DEFAULT
- ;; value and helm-pattern is empty.
- ;; otherwise return helm-pattern
- (if (and (string= helm-pattern "") default)
- default (identity helm-pattern)))
- (unless (or (eq helm-exit-status 1)
- must-match) ; FIXME this should not be needed now.
- default)
- (helm-mode--keyboard-quit)))))
-
-;; Generic completing-read
-;;
-;; Support also function as collection.
-;; e.g M-x man is supported.
-;; Support hash-table and vectors as collection.
-;; NOTE:
-;; Some crap emacs functions may not be supported
-;; like ffap-alternate-file (bad use of completing-read)
-;; and maybe others.
-;; Provide a mode `helm-mode' which turn on
-;; helm in all `completing-read' and `read-file-name' in Emacs.
-;;
-(defvar helm-completion-mode-string " Helm")
-
-(defvar helm-completion-mode-quit-message
- "Helm completion disabled")
-
-(defvar helm-completion-mode-start-message
- "Helm completion enabled")
-
-;;; Specialized handlers
-;;
-;;
-(defun helm-completing-read-symbols
- (prompt _collection test _require-match init
- hist default _inherit-input-method name buffer)
- "Specialized function for fast symbols completion in `helm-mode'."
- (require 'helm-elisp)
- (or
- (helm
- :sources (helm-build-in-buffer-source name
- :init (lambda ()
- (helm-apropos-init (lambda (x)
- (and (funcall test x)
- (not (keywordp x))))
- (or (car-safe default) default)))
- :filtered-candidate-transformer 'helm-apropos-default-sort-fn
- :fuzzy-match helm-mode-fuzzy-match
- :persistent-action
- (lambda (candidate)
- (helm-lisp-completion-persistent-action
- candidate name))
- :persistent-help (helm-lisp-completion-persistent-help))
- :prompt prompt
- :buffer buffer
- :input init
- :history hist
- :resume 'noresume
- :default (or default ""))
- (helm-mode--keyboard-quit)))
-
-
-;;; Generic completing read
-;;
-;;
-(defun helm-completing-read-default-1
- (prompt collection test require-match
- init hist default _inherit-input-method
- name buffer &optional cands-in-buffer exec-when-only-one)
- "Call `helm-comp-read' with same args as `completing-read'.
-Extra optional arg CANDS-IN-BUFFER mean use `candidates-in-buffer'
-method which is faster.
-It should be used when candidate list don't need to rebuild dynamically."
- (let ((history (or (car-safe hist) hist))
- (alistp cands-in-buffer)
- (initial-input (helm-aif (pcase init
- ((pred (stringp)) init)
- ;; INIT is a cons cell.
- (`(,l . ,_ll) l))
- (if minibuffer-completing-file-name it
- (regexp-quote it)))))
- (when (and default (listp default))
- ;; When DEFAULT is a list move the list on head of COLLECTION
- ;; and set it to its car. #bugfix `grep-read-files'.
- (setq collection
- ;; COLLECTION is maybe a function or a table.
- (append default
- (helm-comp-read-get-candidates
- collection test nil (listp collection))))
- ;; Ensure `all-completions' will not be used
- ;; a second time to recompute COLLECTION [1].
- (setq alistp t)
- (setq default (car default)))
- (helm-comp-read
- prompt collection
- :test test
- :history history
- :reverse-history helm-mode-reverse-history
- :input-history history
- :must-match require-match
- :alistp alistp ; Ensure `all-completions' is used when non-nil [1].
- :name name
- :requires-pattern (if (and (string= default "")
- (or (eq require-match 'confirm)
- (eq require-match
- 'confirm-after-completion)))
- 1 0)
- :candidates-in-buffer cands-in-buffer
- :exec-when-only-one exec-when-only-one
- :fuzzy helm-mode-fuzzy-match
- :buffer buffer
- ;; If DEF is not provided, fallback to empty string
- ;; to avoid `thing-at-point' to be appended on top of list
- :default (or default "")
- ;; Fail with special characters (e.g in gnus "nnimap+gmail:")
- ;; if regexp-quote is not used.
- ;; when init is added to history, it will be unquoted by
- ;; helm-comp-read.
- :initial-input initial-input)))
-
-(defun helm-completing-read-with-cands-in-buffer
- (prompt collection test require-match
- init hist default inherit-input-method
- name buffer)
- "Same as `helm-completing-read-default-1' but use candidates-in-buffer."
- ;; Some commands like find-tag may use `read-file-name' from inside
- ;; the calculation of collection. in this case it clash with
- ;; candidates-in-buffer that reuse precedent data (files) which is wrong.
- ;; So (re)calculate collection outside of main helm-session.
- (let ((cands (all-completions (or init "") collection)))
- (helm-completing-read-default-1 prompt cands test require-match
- init hist default inherit-input-method
- name buffer t)))
-
-(cl-defun helm--completing-read-default
- (prompt collection &optional
- predicate require-match
- initial-input hist def
- inherit-input-method)
- "An helm replacement of `completing-read'.
-This function should be used only as a `completing-read-function'.
-
-Don't use it directly, use instead `helm-comp-read' in your programs.
-
-See documentation of `completing-read' and `all-completions' for details."
- (let* ((current-command (or (helm-this-command) this-command))
- (str-command (helm-symbol-name current-command))
- (buf-name (format "*helm-mode-%s*" str-command))
- (entry (assq current-command
- helm-completing-read-handlers-alist))
- (def-com (cdr-safe entry))
- (str-defcom (and def-com (helm-symbol-name def-com)))
- (def-args (list prompt collection predicate require-match
- initial-input hist def inherit-input-method))
- ;; Append the two extra args needed to set the buffer and source name
- ;; in helm specialized functions.
- (any-args (append def-args (list str-command buf-name)))
- helm-completion-mode-start-message ; Be quiet
- helm-completion-mode-quit-message
- ;; Be sure this pesty *completion* buffer doesn't popup.
- ;; 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.
- ;; 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).
- ;; otherwise helm have not the time to close its initial session.
- (minibuffer-setup-hook
- (cl-loop for h in minibuffer-setup-hook
- unless (or (consp h) ; a lambda.
- (byte-code-function-p h)
- (memq h helm-mode-minibuffer-setup-hook-black-list))
- collect h))
- ;; Disable hack that could be used before `completing-read'.
- ;; i.e (push ?\t unread-command-events).
- unread-command-events)
- (when (eq def-com 'ido) (setq def-com 'ido-completing-read))
- (unless (or (not entry) def-com)
- ;; An entry in *read-handlers-alist exists but have
- ;; a nil value, so we exit from here, disable `helm-mode'
- ;; and run the command again with it original behavior.
- ;; `helm-mode' will be restored on exit.
- (cl-return-from helm--completing-read-default
- (unwind-protect
- (progn
- (helm-mode -1)
- (apply completing-read-function def-args))
- (helm-mode 1))))
- ;; If we use now `completing-read' we MUST turn off `helm-mode'
- ;; to avoid infinite recursion and CRASH. It will be reenabled on exit.
- (when (or (eq def-com 'completing-read)
- ;; All specialized functions are prefixed by "helm"
- (and (stringp str-defcom)
- (not (string-match "^helm" str-defcom))))
- (helm-mode -1))
- (unwind-protect
- (cond (;; An helm specialized function exists, run it.
- (and def-com helm-mode)
- (apply def-com any-args))
- (;; Try to handle `ido-completing-read' everywhere.
- (and def-com (eq def-com 'ido-completing-read))
- (setcar (memq collection def-args)
- (all-completions "" collection predicate))
- (apply def-com def-args))
- (;; User set explicitely `completing-read' or something similar
- ;; in *read-handlers-alist, use this with exactly the same
- ;; args as in `completing-read'.
- ;; If we are here `helm-mode' is now disabled.
- def-com
- (apply def-com def-args))
- (t ; Fall back to classic `helm-comp-read'.
- (helm-completing-read-default-1
- prompt collection predicate require-match
- initial-input hist def inherit-input-method
- str-command buf-name)))
- (helm-mode 1)
- ;; When exiting minibuffer, `this-command' is set to
- ;; `helm-exit-minibuffer', which is unwanted when starting
- ;; on another `completing-read', so restore `this-command' to
- ;; initial value when exiting.
- (setq this-command current-command))))
-\f
-;;; Generic read-file-name
-;;
-;;
-;;;###autoload
-(cl-defun helm-read-file-name
- (prompt
- &key
- (name "Read File Name")
- (initial-input default-directory)
- (buffer "*Helm file completions*")
- test
- (case-fold helm-file-name-case-fold-search)
- preselect
- history
- must-match
- default
- marked-candidates
- (candidate-number-limit helm-ff-candidate-number-limit)
- nomark
- (alistp t)
- (persistent-action 'helm-find-files-persistent-action)
- (persistent-help "Hit1 Expand Candidate, Hit2 or (C-u) Find file")
- (mode-line helm-read-file-name-mode-line-string))
- "Read a file name with helm completion.
-It is helm `read-file-name' emulation.
-
-Argument PROMPT is the default prompt to use.
-
-Keys description:
-
-- NAME: Source name, default to \"Read File Name\".
-
-- INITIAL-INPUT: Where to start read file name, default to `default-directory'.
-
-- BUFFER: `helm-buffer' name default to \"*Helm Completions*\".
-
-- TEST: A predicate called with one arg 'candidate'.
-
-- CASE-FOLD: Same as `helm-case-fold-search'.
-
-- PRESELECT: helm preselection.
-
-- HISTORY: Display HISTORY in a special source.
-
-- MUST-MATCH: Can be 'confirm, nil, or t.
-
-- MARKED-CANDIDATES: When non--nil return a list of marked candidates.
-
-- NOMARK: When non--nil don't allow marking candidates.
-
-- ALISTP: Don't use `all-completions' in history (take effect only on history).
-
-- PERSISTENT-ACTION: a persistent action function.
-
-- PERSISTENT-HELP: persistent help message.
-
-- MODE-LINE: A mode line message, default is `helm-read-file-name-mode-line-string'."
-
- (when (get-buffer helm-action-buffer)
- (kill-buffer helm-action-buffer))
- ;; Assume completion have been already required,
- ;; so always use 'confirm.
- (when (eq must-match 'confirm-after-completion)
- (setq must-match 'confirm))
- (let* ((action-fn `(("Sole action (Identity)"
- . (lambda (candidate)
- (if ,marked-candidates
- (helm-marked-candidates :with-wildcard t)
- (identity candidate))))))
- ;; Be sure we don't erase the underlying minibuffer if some.
- (helm-ff-auto-update-initial-value
- (and helm-ff-auto-update-initial-value
- (not (minibuffer-window-active-p (minibuffer-window)))))
- helm-full-frame
- (hist (and history (helm-comp-read-get-candidates
- history nil nil alistp)))
- (minibuffer-completion-confirm must-match)
- (must-match-map (when must-match helm-comp-read-must-match-map))
- (cmap (if must-match-map
- (make-composed-keymap
- must-match-map helm-read-file-map)
- helm-read-file-map))
- (minibuffer-completion-predicate test)
- (minibuffer-completing-file-name t)
- (helm-read-file-name-mode-line-string
- (replace-regexp-in-string "helm-maybe-exit-minibuffer"
- "helm-confirm-and-exit-minibuffer"
- helm-read-file-name-mode-line-string))
- (src-list
- (list
- ;; History source.
- (helm-build-sync-source (format "%s History" name)
- :header-name (lambda (name)
- (concat name (substitute-command-keys
- helm-find-files-doc-header)))
- :mode-line mode-line
- :candidates hist
- :nohighlight t
- :persistent-action persistent-action
- :persistent-help persistent-help
- :nomark nomark
- :action action-fn)
- ;; Other source.
- (helm-build-sync-source name
- :header-name (lambda (name)
- (concat name (substitute-command-keys
- helm-find-files-doc-header)))
- :init (lambda ()
- (setq helm-ff-auto-update-flag
- helm-ff-auto-update-initial-value)
- (setq helm-ff--auto-update-state
- helm-ff-auto-update-flag))
- :mode-line mode-line
- :help-message 'helm-read-file-name-help-message
- :nohighlight t
- :candidates
- (lambda ()
- (append (and (not (file-exists-p helm-pattern))
- (list helm-pattern))
- (if test
- (cl-loop with hn = (helm-ff-tramp-hostnames)
- for i in (helm-find-files-get-candidates
- must-match)
- when (or (member i hn) ; A tramp host
- (funcall test i)) ; Test ok
- collect i)
- (helm-find-files-get-candidates must-match))))
- :filtered-candidate-transformer 'helm-ff-sort-candidates
- :filter-one-by-one 'helm-ff-filter-candidate-one-by-one
- :persistent-action persistent-action
- :persistent-help persistent-help
- :volatile t
- :nomark nomark
- :action action-fn)))
- ;; Helm result.
- (result (helm
- :sources src-list
- :input (expand-file-name initial-input)
- :prompt prompt
- :keymap cmap
- :candidate-number-limit candidate-number-limit
- :resume 'noresume
- :case-fold-search case-fold
- :default default
- :buffer buffer
- :preselect preselect)))
- (or
- (cond ((and result (stringp result)
- (string= result "") ""))
- ((and result
- (stringp result)
- (file-equal-p result initial-input)
- default)
- (if (listp default) (car default) default))
- ((and result (stringp result))
- (expand-file-name result))
- ((and result (listp result))
- (mapcar #'expand-file-name result))
- (t result))
- (when (and (not (string= helm-pattern ""))
- (eq helm-exit-status 0)
- (eq must-match 'confirm))
- (identity helm-pattern))
- (helm-mode--keyboard-quit))))
-
-(defun helm-mode--default-filename (fname dir initial)
- (unless dir (setq dir default-directory))
- (unless (file-name-absolute-p dir)
- (setq dir (expand-file-name dir)))
- (unless (or fname (consp fname))
- (setq fname (expand-file-name
- (or initial buffer-file-name dir)
- dir)))
- (if (and fname (consp fname))
- (setq fname (cl-loop for f in fname
- collect (expand-file-name f dir)))
- (if (file-name-absolute-p fname)
- fname (expand-file-name fname dir))))
-
-(cl-defun helm--generic-read-file-name
- (prompt &optional dir default-filename mustmatch initial predicate)
- "Generic helm replacement of `read-file-name'.
-Don't use it directly, use instead `helm-read-file-name' in your programs."
- (let* ((init (or initial dir default-directory))
- (current-command (or (helm-this-command) this-command))
- (str-command (helm-symbol-name current-command))
- (helm--file-completion-sources
- (cons str-command
- (remove str-command helm--file-completion-sources)))
- (buf-name (format "*helm-mode-%s*" str-command))
- (entry (assq current-command
- helm-completing-read-handlers-alist))
- (def-com (cdr-safe entry))
- (str-defcom (and def-com (helm-symbol-name def-com)))
- (def-args (list prompt dir default-filename mustmatch initial predicate))
- ;; Append the two extra args needed to set the buffer and source name
- ;; in helm specialized functions.
- (any-args (append def-args (list str-command buf-name)))
- (ido-state ido-mode)
- helm-completion-mode-start-message ; Be quiet
- helm-completion-mode-quit-message ; Same here
- fname)
- (setq default-filename (helm-mode--default-filename
- default-filename dir initial))
- ;; Some functions that normally call `completing-read' can switch
- ;; brutally to `read-file-name' (e.g find-tag), in this case
- ;; the helm specialized function will fail because it is build
- ;; for `completing-read', so set it to 'incompatible to be sure
- ;; we switch to `helm-read-file-name' and don't try to call it
- ;; with wrong number of args.
- (when (eq def-com 'ido)
- (setq def-com 'ido-read-file-name) (ido-mode 1))
- (when (and def-com (> (length (help-function-arglist def-com)) 8))
- (setq def-com 'incompatible))
- (unless (or (not entry) def-com)
- (cl-return-from helm--generic-read-file-name
- (unwind-protect
- (progn
- (helm-mode -1)
- (apply read-file-name-function def-args))
- (helm-mode 1))))
- ;; If we use now `read-file-name' we MUST turn off `helm-mode'
- ;; to avoid infinite recursion and CRASH. It will be reenabled on exit.
- (when (or (eq def-com 'read-file-name)
- (eq def-com 'ido-read-file-name)
- (and (stringp str-defcom)
- (not (string-match "^helm" str-defcom))))
- (helm-mode -1))
- (unwind-protect
- (setq fname
- (cond (;; A specialized function exists, run it
- ;; with the two extra args specific to helm..
- (and def-com helm-mode
- (not (eq def-com 'ido-read-file-name))
- (not (eq def-com 'incompatible)))
- (apply def-com any-args))
- (;; Def-com value is `ido-read-file-name'
- ;; run it with default args.
- (and def-com (eq def-com 'ido-read-file-name))
- (ido-mode 1)
- (apply def-com def-args))
- (;; Def-com value is `read-file-name'
- ;; run it with default args.
- (eq def-com 'read-file-name)
- (apply def-com def-args))
- (t ; Fall back to classic `helm-read-file-name'.
- (helm-read-file-name
- prompt
- :name str-command
- :buffer buf-name
- :default default-filename
- :initial-input (expand-file-name init dir)
- :alistp nil
- :must-match mustmatch
- :test predicate))))
- (helm-mode 1)
- (ido-mode (if ido-state 1 -1))
- ;; Same comment as in `helm--completing-read-default'.
- (setq this-command current-command))
- (if (eq predicate 'file-directory-p) ; Using `read-directory-name'.
- (file-name-as-directory fname) fname)))
-
-(defun helm-mode--advice-lisp--local-variables (old--fn &rest args)
- (ignore-errors
- (apply old--fn args)))
-
-(defun helm--completion-in-region (start end collection &optional predicate)
- "Helm replacement of `completion--in-region'.
-Can be used as value for `completion-in-region-function'."
- (cl-declare (special require-match prompt))
- (if (memq major-mode helm-mode-no-completion-in-region-in-modes)
- (funcall helm--old-completion-in-region-function
- start end collection predicate)
- (advice-add
- 'lisp--local-variables
- :around #'helm-mode--advice-lisp--local-variables)
- (unwind-protect
- (let* ((enable-recursive-minibuffers t)
- (input (buffer-substring-no-properties start end))
- (current-command (or (helm-this-command) this-command))
- (str-command (helm-symbol-name current-command))
- (buf-name (format "*helm-mode-%s*" str-command))
- (require-match (or (and (boundp 'require-match) require-match)
- minibuffer-completion-confirm
- ;; If prompt have not been propagated here, that's
- ;; probably mean we have no prompt and we are in
- ;; completion-at-point or friend, so use a non--nil
- ;; value for require-match.
- (not (boundp 'prompt))))
- ;; `completion-extra-properties' is let-bounded in `completion-at-point'.
- ;; `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.
- (afun (plist-get completion-extra-properties :annotation-function))
- (metadata (completion-metadata
- (buffer-substring-no-properties start (point))
- collection predicate))
- (data (completion-all-completions
- (buffer-substring start end)
- collection
- predicate
- (- (point) start)
- metadata))
- ;; `completion-all-completions' store the base-size in the last `cdr',
- ;; so data looks like this: '(a b c d . 0) and (last data) == (d . 0).
- (last-data (last data))
- (base-size (helm-aif (cdr (last data))
- (prog1 it
- (setcdr last-data nil))
- 0))
- (init-space-suffix (unless (or helm-completion-in-region-fuzzy-match
- (string-suffix-p " " input))
- " "))
- (file-comp-p (or (eq (completion-metadata-get metadata 'category) 'file)
- (helm-mode--in-file-completion-p)
- ;; Assume that when `afun' and `predicate' are null
- ;; we are in filename completion.
- (and (null afun) (null predicate))))
- ;; Completion-at-point and friends have no prompt.
- (result (if (stringp data)
- data
- (helm-comp-read
- (or (and (boundp 'prompt) prompt) "Pattern: ")
- (if file-comp-p
- (cl-loop for f in data unless
- (string-match "\\`\\.\\{1,2\\}/\\'" f)
- collect f)
- (if afun
- (mapcar (lambda (s)
- (let ((ann (funcall afun s)))
- (if ann
- (cons
- (concat
- s
- (propertize
- " " 'display
- (propertize
- ann
- 'face 'completions-annotations)))
- s)
- s)))
- data)
- data))
- :name str-command
- :fuzzy helm-completion-in-region-fuzzy-match
- :nomark t
- :initial-input
- (cond ((and file-comp-p
- (not (string-match "/\\'" input)))
- (concat (helm-basename input)
- (unless (string= input "")
- init-space-suffix)))
- ((string-match "/\\'" input) nil)
- ((or (null require-match)
- (stringp require-match))
- input)
- (t (concat input init-space-suffix)))
- :buffer buf-name
- :fc-transformer (append (list 'helm-cr-default-transformer)
- (unless helm-completion-in-region-fuzzy-match
- (list (lambda (candidates _source)
- (sort candidates 'helm-generic-sort-fn)))))
- :exec-when-only-one t
- :quit-when-no-cand
- (lambda ()
- ;; Delay message to overwrite "Quit".
- (run-with-timer
- 0.01 nil
- (lambda ()
- (message "[No matches]")))
- t) ; exit minibuffer immediately.
- :must-match require-match))))
- (when result
- (choose-completion-string
- result (current-buffer)
- (list (+ start base-size) end)
- completion-list-insert-choice-function)))
- (advice-remove 'lisp--local-variables
- #'helm-mode--advice-lisp--local-variables))))
-
-(defun helm-mode--in-file-completion-p ()
- (with-helm-current-buffer
- (run-hook-with-args-until-success 'file-name-at-point-functions)))
-
-(when (boundp 'completion-in-region-function)
- (defconst helm--old-completion-in-region-function completion-in-region-function))
-
-;;;###autoload
-(define-minor-mode helm-mode
- "Toggle generic helm completion.
-
-All functions in Emacs that use `completing-read'
-or `read-file-name' 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 turn it on with `helm-mode'.
-
-Some crap emacs functions may not be supported,
-e.g `ffap-alternate-file' and maybe others
-You can add such functions to `helm-completing-read-handlers-alist'
-with a nil value.
-
-Note: This mode is incompatible with Emacs23."
- :group 'helm-mode
- :global t
- :lighter helm-completion-mode-string
- (cl-assert (boundp 'completing-read-function) nil
- "`helm-mode' not available, upgrade to Emacs-24")
- (if helm-mode
- (if (fboundp 'add-function)
- (progn
- (add-function :override completing-read-function
- #'helm--completing-read-default)
- (add-function :override read-file-name-function
- #'helm--generic-read-file-name)
- (when helm-mode-handle-completion-in-region
- (add-function :override completion-in-region-function
- #'helm--completion-in-region)))
- (setq completing-read-function 'helm--completing-read-default
- read-file-name-function 'helm--generic-read-file-name)
- (when (and (boundp 'completion-in-region-function)
- helm-mode-handle-completion-in-region)
- (setq completion-in-region-function #'helm--completion-in-region))
- (message helm-completion-mode-start-message))
- (if (fboundp 'remove-function)
- (progn
- (remove-function completing-read-function #'helm--completing-read-default)
- (remove-function read-file-name-function #'helm--generic-read-file-name)
- (remove-function completion-in-region-function #'helm--completion-in-region))
- (setq completing-read-function (and (fboundp 'completing-read-default)
- 'completing-read-default)
- read-file-name-function (and (fboundp 'read-file-name-default)
- 'read-file-name-default))
- (when (and (boundp 'completion-in-region-function)
- (boundp 'helm--old-completion-in-region-function))
- (setq completion-in-region-function helm--old-completion-in-region-function))
- (message helm-completion-mode-quit-message))))
-
-(provide 'helm-mode)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-mode.el ends here
+++ /dev/null
-;;; helm-multi-match.el --- Multiple regexp matching methods for helm -*- lexical-binding: t -*-
-
-;; Original Author: rubikitch
-
-;; Copyright (C) 2008 ~ 2011 rubikitch
-;; Copyright (C) 2011 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.com>
-
-;; Author: Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.com>
-;; URL: http://github.com/emacs-helm/helm
-
-;; 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 'cl-lib)
-(require 'helm-lib)
-
-\f
-(defgroup helm-multi-match nil
- "Helm multi match."
- :group 'helm)
-
-(defcustom helm-mm-matching-method '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."
- :type '(radio :tag "Matching methods for helm"
- (const :tag "Multiple regexp 1 ordered with prefix match" multi1)
- (const :tag "Multiple regexp 2 ordered with partial match" multi2)
- (const :tag "Multiple regexp 3 matching no order, partial, best." multi3)
- (const :tag "Multiple regexp 3p matching with prefix match" multi3p))
- :group 'helm-multi-match)
-
-\f
-;; Internal
-(defconst helm-mm-default-match-functions
- '(helm-mm-exact-match helm-mm-match))
-(defconst helm-mm-default-search-functions
- '(helm-mm-exact-search helm-mm-search))
-
-\f
-;;; Build regexps
-;;
-;;
-(defvar helm-mm-space-regexp "[\\ ] "
- "Regexp to represent space itself in multiple regexp match.")
-
-(defun helm-mm-split-pattern (pattern)
- "Split PATTERN if it contain spaces and return resulting list.
-If spaces in PATTERN are escaped, don't split at this place.
-i.e \"foo bar\"=> (\"foo\" \"bar\")
-but \"foo\ bar\"=> (\"foobar\")."
- (if (string= pattern "")
- '("")
- (cl-loop for s in (split-string
- (replace-regexp-in-string helm-mm-space-regexp
- "\000\000" pattern)
- " " t)
- collect (replace-regexp-in-string "\000\000" " " s))))
-
-(defun helm-mm-1-make-regexp (pattern)
- "Replace spaces in PATTERN with \"\.*\"."
- (mapconcat 'identity (helm-mm-split-pattern pattern) ".*"))
-
-\f
-;;; Exact match.
-;;
-;;
-;; Internal.
-(defvar helm-mm-exact-pattern-str nil)
-(defvar helm-mm-exact-pattern-real nil)
-
-(defun helm-mm-exact-get-pattern (pattern)
- (unless (equal pattern helm-mm-exact-pattern-str)
- (setq helm-mm-exact-pattern-str pattern
- helm-mm-exact-pattern-real (concat "\n" pattern "\n")))
- helm-mm-exact-pattern-real)
-
-
-(cl-defun helm-mm-exact-match (str &optional (pattern helm-pattern))
- (if case-fold-search
- (progn
- (setq str (downcase str)
- pattern (downcase pattern))
- (string= str pattern))
- (string= str pattern)))
-
-(defun helm-mm-exact-search (pattern &rest _ignore)
- (and (search-forward (helm-mm-exact-get-pattern pattern) nil t)
- (forward-line -1)))
-
-\f
-;;; Prefix match
-;;
-;;
-;; Internal
-(defvar helm-mm-prefix-pattern-str nil)
-(defvar helm-mm-prefix-pattern-real nil)
-
-(defun helm-mm-prefix-get-pattern (pattern)
- (unless (equal pattern helm-mm-prefix-pattern-str)
- (setq helm-mm-prefix-pattern-str pattern
- helm-mm-prefix-pattern-real (concat "\n" pattern)))
- helm-mm-prefix-pattern-real)
-
-(defun helm-mm-prefix-match (str &optional pattern)
- ;; In filename completion basename and basedir may be
- ;; quoted, unquote them for string comparison (Issue #1283).
- (setq pattern (replace-regexp-in-string
- "\\\\" "" (or pattern helm-pattern)))
- (let ((len (length pattern)))
- (and (<= len (length str))
- (string= (substring str 0 len) pattern ))))
-
-(defun helm-mm-prefix-search (pattern &rest _ignore)
- (search-forward (helm-mm-prefix-get-pattern pattern) nil t))
-
-\f
-;;; Multiple regexp patterns 1 (order is preserved / prefix).
-;;
-;;
-;; Internal
-(defvar helm-mm-1-pattern-str nil)
-(defvar helm-mm-1-pattern-real nil)
-
-(defun helm-mm-1-get-pattern (pattern)
- (unless (equal pattern helm-mm-1-pattern-str)
- (setq helm-mm-1-pattern-str pattern
- helm-mm-1-pattern-real
- (concat "^" (helm-mm-1-make-regexp pattern))))
- helm-mm-1-pattern-real)
-
-(cl-defun helm-mm-1-match (str &optional (pattern helm-pattern))
- (string-match (helm-mm-1-get-pattern pattern) str))
-
-(defun helm-mm-1-search (pattern &rest _ignore)
- (re-search-forward (helm-mm-1-get-pattern pattern) nil t))
-
-\f
-;;; Multiple regexp patterns 2 (order is preserved / partial).
-;;
-;;
-;; Internal
-(defvar helm-mm-2-pattern-str nil)
-(defvar helm-mm-2-pattern-real nil)
-
-(defun helm-mm-2-get-pattern (pattern)
- (unless (equal pattern helm-mm-2-pattern-str)
- (setq helm-mm-2-pattern-str pattern
- helm-mm-2-pattern-real
- (concat "^.*" (helm-mm-1-make-regexp pattern))))
- helm-mm-2-pattern-real)
-
-(cl-defun helm-mm-2-match (str &optional (pattern helm-pattern))
- (string-match (helm-mm-2-get-pattern pattern) str))
-
-(defun helm-mm-2-search (pattern &rest _ignore)
- (re-search-forward (helm-mm-2-get-pattern pattern) nil t))
-
-\f
-;;; Multiple regexp patterns 3 (permutation).
-;;
-;;
-;; Internal
-(defvar helm-mm-3-pattern-str nil)
-(defvar helm-mm-3-pattern-list nil)
-
-(defun helm-mm-3-get-patterns (pattern)
- "Return `helm-mm-3-pattern-list', a list of predicate/regexp cons cells.
-e.g ((identity . \"foo\") (identity . \"bar\")).
-This is done only if `helm-mm-3-pattern-str' is same as PATTERN."
- (unless (equal pattern helm-mm-3-pattern-str)
- (setq helm-mm-3-pattern-str pattern
- helm-mm-3-pattern-list
- (helm-mm-3-get-patterns-internal pattern)))
- helm-mm-3-pattern-list)
-
-(defun helm-mm-3-get-patterns-internal (pattern)
- "Return a list of predicate/regexp cons cells.
-e.g ((identity . \"foo\") (identity . \"bar\"))."
- (unless (string= pattern "")
- (cl-loop for pat in (helm-mm-split-pattern pattern)
- collect (if (string= "!" (substring pat 0 1))
- (cons 'not (substring pat 1))
- (cons 'identity pat)))))
-
-(cl-defun helm-mm-3-match (str &optional (pattern helm-pattern))
- "Check if PATTERN match STR.
-When PATTERN contain a space, it is splitted and matching is done
-with the several resulting regexps against STR.
-e.g \"bar foo\" will match \"foobar\" and \"barfoo\".
-Argument PATTERN, a string, is transformed in a list of
-cons cell with `helm-mm-3-get-patterns' if it contain a space.
-e.g \"foo bar\"=>((identity . \"foo\") (identity . \"bar\")).
-Then each predicate of cons cell(s) is called with regexp of same
-cons cell against STR (a candidate).
-i.e (identity (string-match \"foo\" \"foo bar\")) => t."
- (let ((pat (helm-mm-3-get-patterns pattern)))
- (cl-loop for (predicate . regexp) in pat
- always (funcall predicate
- (condition-case _err
- ;; FIXME: Probably do nothing when
- ;; using fuzzy leaving the job
- ;; to the fuzzy fn.
- (string-match regexp str)
- (invalid-regexp nil))))))
-
-(defun helm-mm-3-search-base (pattern searchfn1 searchfn2)
- "Try to find PATTERN in `helm-buffer' with SEARCHFN1 and SEARCHFN2.
-This is the search function for `candidates-in-buffer' enabled sources.
-Use the same method as `helm-mm-3-match' except it search in buffer
-instead of matching on a string.
-i.e (identity (re-search-forward \"foo\" (point-at-eol) t)) => t."
- (cl-loop with pat = (if (stringp pattern)
- (helm-mm-3-get-patterns pattern)
- pattern)
- when (eq (caar pat) 'not) return
- ;; Pass the job to `helm-search-match-part'.
- (prog1 (list (point-at-bol) (point-at-eol))
- (forward-line 1))
- while (condition-case _err
- (funcall searchfn1 (or (cdar pat) "") nil t)
- (invalid-regexp nil))
- for bol = (point-at-bol)
- for eol = (point-at-eol)
- if (cl-loop for (pred . str) in (cdr pat) always
- (progn (goto-char bol)
- (funcall pred (condition-case _err
- (funcall searchfn2 str eol t)
- (invalid-regexp nil)))))
- do (goto-char eol) and return t
- else do (goto-char eol)
- finally return nil))
-
-(defun helm-mm-3-search (pattern &rest _ignore)
- (when (stringp pattern)
- (setq pattern (helm-mm-3-get-patterns pattern)))
- (helm-mm-3-search-base
- pattern 're-search-forward 're-search-forward))
-\f
-;;; mp-3 with migemo
-;;
-;;
-(defvar helm-mm--previous-migemo-info nil
- "[Internal] Cache previous migemo query.")
-(make-local-variable 'helm-mm--previous-migemo-info)
-
-(declare-function migemo-get-pattern "ext:migemo.el")
-(declare-function migemo-search-pattern-get "ext:migemo.el")
-
-(define-minor-mode helm-migemo-mode
- "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."
- :lighter " Hmio"
- :group 'helm
- :global t
- (cl-assert (featurep 'migemo)
- nil "No feature called migemo found, install migemo.el."))
-
-(defun helm-mm-migemo-get-pattern (pattern)
- (let ((regex (migemo-get-pattern pattern)))
- (if (ignore-errors (string-match regex "") t)
- (concat regex "\\|" pattern) pattern)))
-
-(defun helm-mm-migemo-search-pattern-get (pattern)
- (let ((regex (migemo-search-pattern-get pattern)))
- (if (ignore-errors (string-match regex "") t)
- (concat regex "\\|" pattern) pattern)))
-
-(defun helm-mm-migemo-string-match (pattern str)
- "Migemo version of `string-match'."
- (unless (assoc pattern helm-mm--previous-migemo-info)
- (with-helm-buffer
- (setq helm-mm--previous-migemo-info
- (push (cons pattern (helm-mm-migemo-get-pattern pattern))
- helm-mm--previous-migemo-info))))
- (string-match (assoc-default pattern helm-mm--previous-migemo-info) str))
-
-(cl-defun helm-mm-3-migemo-match (str &optional (pattern helm-pattern))
- (and helm-migemo-mode
- (cl-loop for (pred . re) in (helm-mm-3-get-patterns pattern)
- always (funcall pred (helm-mm-migemo-string-match re str)))))
-
-(defun helm-mm-migemo-forward (word &optional bound noerror count)
- (with-helm-buffer
- (unless (assoc word helm-mm--previous-migemo-info)
- (setq helm-mm--previous-migemo-info
- (push (cons word (if (delq 'ascii (find-charset-string word))
- word
- (helm-mm-migemo-search-pattern-get word)))
- helm-mm--previous-migemo-info))))
- (re-search-forward
- (assoc-default word helm-mm--previous-migemo-info) bound noerror count))
-
-(defun helm-mm-3-migemo-search (pattern &rest _ignore)
- (and helm-migemo-mode
- (helm-mm-3-search-base
- pattern 'helm-mm-migemo-forward 'helm-mm-migemo-forward)))
-
-\f
-;;; mp-3p- (multiple regexp pattern 3 with prefix search)
-;;
-;;
-(defun helm-mm-3p-match (str &optional pattern)
- "Check if PATTERN match STR.
-Same as `helm-mm-3-match' but more strict, matching against prefix also.
-e.g \"bar foo\" will match \"barfoo\" but not \"foobar\" contrarily to
-`helm-mm-3-match'."
- (let* ((pat (helm-mm-3-get-patterns (or pattern helm-pattern)))
- (first (car pat)))
- (and (funcall (car first) (helm-mm-prefix-match str (cdr first)))
- (cl-loop for (predicate . regexp) in (cdr pat)
- always (funcall predicate (string-match regexp str))))))
-
-(defun helm-mm-3p-search (pattern &rest _ignore)
- (when (stringp pattern)
- (setq pattern (helm-mm-3-get-patterns pattern)))
- (helm-mm-3-search-base
- pattern 'helm-mm-prefix-search 're-search-forward))
-
-\f
-;;; Generic multi-match/search functions
-;;
-;;
-(cl-defun helm-mm-match (str &optional (pattern helm-pattern))
- (let ((fun (cl-ecase helm-mm-matching-method
- (multi1 #'helm-mm-1-match)
- (multi2 #'helm-mm-2-match)
- (multi3 #'helm-mm-3-match)
- (multi3p #'helm-mm-3p-match))))
- (funcall fun str pattern)))
-
-(defun helm-mm-search (pattern &rest _ignore)
- (let ((fun (cl-ecase helm-mm-matching-method
- (multi1 #'helm-mm-1-search)
- (multi2 #'helm-mm-2-search)
- (multi3 #'helm-mm-3-search)
- (multi3p #'helm-mm-3p-search))))
- (funcall fun pattern)))
-
-
-(provide 'helm-multi-match)
-
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-multi-match.el ends here
+++ /dev/null
-;;; helm-net.el --- helm browse url and search web. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'url)
-(require 'xml)
-(require 'browse-url)
-
-\f
-(defgroup helm-net nil
- "Net related applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-google-suggest-default-browser-function 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'."
- :group 'helm-net
- :type 'symbol)
-
-(defcustom helm-home-url "http://www.google.fr"
- "Default url to use as home url."
- :group 'helm-net
- :type 'string)
-
-(defcustom helm-surfraw-default-browser-function nil
- "The browse url function you prefer to use with surfraw.
-When nil, fallback to `browse-url-browser-function'."
- :group 'helm-net
- :type 'symbol)
-
-(defcustom helm-google-suggest-url
- "http://google.com/complete/search?output=toolbar&q="
- "URL used for looking up Google suggestions."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-google-suggest-search-url
- "http://www.google.com/search?ie=utf-8&oe=utf-8&q=%s"
- "URL used for Google searching."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-net-prefer-curl nil
- "When non--nil use CURL external program to fetch data.
-Otherwise `url-retrieve-synchronously' is used."
- :type 'boolean
- :group 'helm-net)
-
-(defvaralias 'helm-google-suggest-use-curl-p 'helm-net-prefer-curl)
-(make-obsolete-variable 'helm-google-suggest-use-curl-p 'helm-net-prefer-curl "1.7.7")
-
-(defcustom helm-surfraw-duckduckgo-url
- "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."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-wikipedia-suggest-url
- "https://en.wikipedia.org/w/api.php?action=opensearch&search="
- "Url used for looking up Wikipedia suggestions."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-wikipedia-url
- "https://en.wikipedia.org/wiki/Special:Search?search=%s"
- "The Wikipedia search url.
-This is a format string, don't forget the `%s'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-wikipedia-summary-url
- "http://en.wikipedia.org/w/api.php?action=parse&format=json&prop=text§ion=0&page="
- "URL for getting the summary of a Wikipedia topic."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-wikipedia-follow-delay 2
- "Delay before wikipedia summary popup."
- :type 'number
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-youtube-url
- "http://www.youtube.com/results?aq=f&search_query=%s"
- "The Youtube search url.
-This is a format string, don't forget the `%s'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-imdb-url
- "http://www.imdb.com/find?s=all&q=%s"
- "The IMDb search url.
-This is a format string, don't forget the `%s'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-google-maps-url
- "http://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'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-search-suggest-action-google-news-url
- "http://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'."
- :type 'string
- :group 'helm-net)
-
-(defcustom helm-google-suggest-actions
- '(("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))))
- "List of actions for google suggest sources."
- :group 'helm-net
- :type '(alist :key-type string :value-type function))
-
-(defcustom helm-browse-url-firefox-new-window "-new-tab"
- "Allow choosing to browse url in new window or new tab.
-Can be \"-new-tab\" (default) or \"-new-window\"."
- :group 'helm-net
- :type '(radio
- (const :tag "New tab" "-new-tab")
- (const :tag "New window" "-new-window")))
-
-\f
-;;; Additional actions for search suggestions
-;;
-;;
-;; Internal
-
-(defun helm-search-suggest-perform-additional-action (url query)
- "Perform the search via URL using QUERY as input."
- (browse-url (format url (url-hexify-string query))))
-
-(defun helm-net--url-retrieve-sync (request parser)
- (if helm-net-prefer-curl
- (with-temp-buffer
- (call-process "curl" nil t nil request)
- (funcall parser))
- (with-current-buffer (url-retrieve-synchronously request)
- (funcall parser))))
-
-\f
-;;; Google Suggestions
-;;
-;;
-(defun helm-google-suggest-parser ()
- (cl-loop
- with result-alist = (xml-get-children
- (car (xml-parse-region
- (point-min) (point-max)))
- 'CompleteSuggestion)
- for i in result-alist collect
- (cdr (cl-caadr (assoc 'suggestion i)))))
-
-(defun helm-google-suggest-fetch (input)
- "Fetch suggestions for INPUT from XML buffer."
- (let ((request (concat helm-google-suggest-url
- (url-hexify-string input))))
- (helm-net--url-retrieve-sync
- request #'helm-google-suggest-parser)))
-
-(defun helm-google-suggest-set-candidates (&optional request-prefix)
- "Set candidates with result and number of google results found."
- (let ((suggestions (helm-google-suggest-fetch
- (or (and request-prefix
- (concat request-prefix
- " " helm-pattern))
- helm-pattern))))
- (if (member helm-pattern suggestions)
- suggestions
- ;; if there is no suggestion exactly matching the input then
- ;; prepend a Search on Google item to the list
- (append
- suggestions
- (list (cons (format "Search for '%s' on Google" helm-input)
- helm-input))))))
-
-(defun helm-ggs-set-number-result (num)
- (if num
- (progn
- (and (numberp num) (setq num (number-to-string num)))
- (cl-loop for i in (reverse (split-string num "" t))
- for count from 1
- append (list i) into C
- when (= count 3)
- append (list ",") into C
- and do (setq count 0)
- finally return
- (replace-regexp-in-string
- "^," "" (mapconcat 'identity (reverse C) ""))))
- "?"))
-
-(defun helm-google-suggest-action (candidate)
- "Default action to jump to a google suggested candidate."
- (let ((arg (format helm-google-suggest-search-url
- (url-hexify-string candidate))))
- (helm-aif helm-google-suggest-default-browser-function
- (funcall it arg)
- (helm-browse-url arg))))
-
-(defvar helm-google-suggest-default-function
- 'helm-google-suggest-set-candidates
- "Default function to use in helm google suggest.")
-
-(defvar helm-source-google-suggest
- (helm-build-sync-source "Google Suggest"
- :candidates (lambda ()
- (funcall helm-google-suggest-default-function))
- :action 'helm-google-suggest-actions
- :volatile t
- :keymap helm-map
- :requires-pattern 3))
-
-(defun helm-google-suggest-emacs-lisp ()
- "Try to emacs lisp complete with google suggestions."
- (helm-google-suggest-set-candidates "emacs lisp"))
-
-;;; Wikipedia suggestions
-;;
-;;
-(declare-function json-read-from-string "json" (string))
-(defun helm-wikipedia-suggest-fetch ()
- "Fetch Wikipedia suggestions and return them as a list."
- (require 'json)
- (let ((request (concat helm-wikipedia-suggest-url
- (url-hexify-string helm-pattern))))
- (helm-net--url-retrieve-sync
- request #'helm-wikipedia--parse-buffer)))
-
-(defun helm-wikipedia--parse-buffer ()
- (goto-char (point-min))
- (when (re-search-forward "^\\[.+\\[\\(.*\\)\\]\\]" nil t)
- (cl-loop for i across (aref (json-read-from-string (match-string 0)) 1)
- collect i into result
- finally return (or result
- (append
- result
- (list (cons (format "Search for '%s' on wikipedia"
- helm-pattern)
- helm-pattern)))))))
-
-(defvar helm-wikipedia--summary-cache (make-hash-table :test 'equal))
-(defun helm-wikipedia-persistent-action (candidate)
- (unless (string= (format "Search for '%s' on wikipedia"
- helm-pattern)
- (helm-get-selection nil t))
- (message "Fetching summary from Wikipedia...")
- (let ((buf (get-buffer-create "*helm wikipedia summary*"))
- result mess)
- (while (progn
- (setq result (or (gethash candidate helm-wikipedia--summary-cache)
- (puthash candidate
- (prog1
- (helm-wikipedia-fetch-summary candidate)
- (setq mess "Done"))
- helm-wikipedia--summary-cache)))
- (when (and result
- (listp result))
- (setq candidate (cdr result))
- (message "Redirected to %s" candidate)
- t)))
- (if (not result)
- (message "Error when getting summary.")
- (with-current-buffer buf
- (erase-buffer)
- (setq cursor-type nil)
- (insert result)
- (fill-region (point-min) (point-max))
- (goto-char (point-min)))
- (display-buffer buf)
- (message mess)))))
-
-(defun helm-wikipedia-fetch-summary (input)
- (let* ((request (concat helm-wikipedia-summary-url
- (url-hexify-string input))))
- (helm-net--url-retrieve-sync
- request #'helm-wikipedia--parse-summary)))
-
-(defun helm-wikipedia--parse-summary ()
- (goto-char (point-min))
- (when (search-forward "{" nil t)
- (let ((result (cdr (assoc '*
- (assoc 'text
- (assoc 'parse
- (json-read-from-string
- (buffer-substring-no-properties
- (1- (point)) (point-max)))))))))
- (when result
- (if (string-match "<span class=\"redirectText\"><a href=[^>]+>\\([^<]+\\)" result)
- (cons 'redirect (match-string 1 result))
-
- ;; find the beginning of the summary text in the result
-
- ;; check if there is a table before the summary and skip that
- (when (or (string-match "</table>\\(\n<div.*?</div>\\)?\n<p>" result)
- ;; otherwise just find the first paragraph
- (string-match "<p>" result))
- ;; remove cruft and do a simple formatting
- (replace-regexp-in-string
- "Cite error: .*" ""
- (replace-regexp-in-string
- " " ""
- (replace-regexp-in-string
- "\\[[^\]]+\\]" ""
- (replace-regexp-in-string
- "<[^>]*>" ""
- (replace-regexp-in-string
- "</p>\n<p>" "\n\n"
- (substring result (match-end 0)))))))))))))
-
-
-(defvar helm-source-wikipedia-suggest
- (helm-build-sync-source "Wikipedia Suggest"
- :candidates #'helm-wikipedia-suggest-fetch
- :action '(("Wikipedia" . (lambda (candidate)
- (helm-search-suggest-perform-additional-action
- helm-search-suggest-action-wikipedia-url
- candidate))))
- :persistent-action #'helm-wikipedia-persistent-action
- :volatile t
- :keymap helm-map
- :follow 1
- :follow-delay helm-wikipedia-follow-delay
- :requires-pattern 3))
-
-\f
-;;; Web browser functions.
-;;
-;;
-;; If default setting of `w3m-command' is not
-;; what you want and you modify it, you will have to reeval
-;; also `helm-browse-url-default-browser-alist'.
-
-(defvar helm-browse-url-chromium-program "chromium-browser")
-(defvar helm-browse-url-uzbl-program "uzbl-browser")
-(defvar helm-browse-url-conkeror-program "conkeror")
-(defvar helm-browse-url-default-browser-alist
- `((,(or (and (boundp 'w3m-command) w3m-command)
- "/usr/bin/w3m") . w3m-browse-url)
- (,browse-url-firefox-program . browse-url-firefox)
- (,helm-browse-url-chromium-program . helm-browse-url-chromium)
- (,helm-browse-url-conkeror-program . helm-browse-url-conkeror)
- (,helm-browse-url-uzbl-program . helm-browse-url-uzbl)
- (,browse-url-kde-program . browse-url-kde)
- (,browse-url-gnome-moz-program . browse-url-gnome-moz)
- (,browse-url-mozilla-program . browse-url-mozilla)
- (,browse-url-galeon-program . browse-url-galeon)
- (,browse-url-netscape-program . browse-url-netscape)
- (,browse-url-mosaic-program . browse-url-mosaic)
- (,browse-url-xterm-program . browse-url-text-xterm)
- ("emacs" . eww-browse-url))
- "*Alist of \(executable . function\) to try to find a suitable url browser.")
-
-(cl-defun helm-generic-browser (url cmd-name &rest args)
- "Browse URL with NAME browser."
- (let ((proc (concat cmd-name " " url)))
- (message "Starting %s..." cmd-name)
- (apply 'start-process proc nil cmd-name
- (append args (list url)))
- (set-process-sentinel
- (get-process proc)
- (lambda (process event)
- (when (string= event "finished\n")
- (message "%s process %s" process event))))))
-
-(defun 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 open
-and not be prompted to kill firefox process.
-
-NOTE: Probably not supported on some systems (e.g Windows)."
- (interactive (list (read-string "URL: " (browse-url-url-at-point))
- nil))
- (let ((process-environment (browse-url-process-environment)))
- (call-process-shell-command
- (format "(%s %s %s &)"
- browse-url-firefox-program
- helm-browse-url-firefox-new-window
- url))))
-
-(defun helm-browse-url-chromium (url &optional _ignore)
- "Browse URL with google chrome browser."
- (interactive "sURL: ")
- (helm-generic-browser
- url helm-browse-url-chromium-program))
-
-(defun helm-browse-url-uzbl (url &optional _ignore)
- "Browse URL with uzbl browser."
- (interactive "sURL: ")
- (helm-generic-browser url helm-browse-url-uzbl-program "-u"))
-
-(defun helm-browse-url-conkeror (url &optional _ignore)
- "Browse URL with conkeror browser."
- (interactive "sURL: ")
- (helm-generic-browser url helm-browse-url-conkeror-program))
-
-(defun helm-browse-url-default-browser (url &rest args)
- "Find the first available browser and ask it to load URL."
- (let ((default-browser-fn
- (cl-loop for (exe . fn) in helm-browse-url-default-browser-alist
- thereis (and exe (executable-find exe) (fboundp fn) fn))))
- (if default-browser-fn
- (apply default-browser-fn url args)
- (error "No usable browser found"))))
-
-(defun helm-browse-url (url &rest args)
- "Default command to browse URL."
- (if browse-url-browser-function
- (browse-url url args)
- (helm-browse-url-default-browser url args)))
-
-\f
-;;; Surfraw
-;;
-;; Need external program surfraw.
-;; <http://surfraw.alioth.debian.org/>
-
-;; Internal
-(defvar helm-surfraw-engines-history nil)
-(defvar helm-surfraw-input-history nil)
-(defvar helm-surfraw--elvi-cache nil)
-
-(defun helm-build-elvi-list ()
- "Return list of all engines and descriptions handled by surfraw."
- (or helm-surfraw--elvi-cache
- (setq helm-surfraw--elvi-cache
- (cdr (with-temp-buffer
- (call-process "surfraw" nil t nil "-elvi")
- (split-string (buffer-string) "\n"))))))
-
-;;;###autoload
-(defun helm-surfraw (pattern engine)
- "Preconfigured `helm' to search PATTERN with search ENGINE."
- (interactive (list (read-string "SearchFor: "
- nil 'helm-surfraw-input-history
- (thing-at-point 'symbol))
- (helm-comp-read
- "Engine: "
- (helm-build-elvi-list)
- :must-match t
- :name "Surfraw Search Engines"
- :del-input nil
- :history helm-surfraw-engines-history)))
- (let* ((engine-nodesc (car (split-string engine)))
- (url (if (string= engine-nodesc "duckduckgo")
- ;; "sr duckduckgo -p foo" is broken, workaround.
- (format helm-surfraw-duckduckgo-url
- (url-hexify-string pattern))
- (with-temp-buffer
- (apply 'call-process "surfraw" nil t nil
- (append (list engine-nodesc "-p") (split-string pattern)))
- (replace-regexp-in-string
- "\n" "" (buffer-string)))))
- (browse-url-browser-function (or helm-surfraw-default-browser-function
- browse-url-browser-function)))
- (if (string= engine-nodesc "W")
- (helm-browse-url helm-home-url)
- (helm-browse-url url)
- (setq helm-surfraw-engines-history
- (cons engine (delete engine helm-surfraw-engines-history))))))
-
-;;;###autoload
-(defun helm-google-suggest ()
- "Preconfigured `helm' for google search with google suggest."
- (interactive)
- (helm-other-buffer 'helm-source-google-suggest "*helm google*"))
-
-;;;###autoload
-(defun helm-wikipedia-suggest ()
- "Preconfigured `helm' for Wikipedia lookup with Wikipedia suggest."
- (interactive)
- (helm :sources 'helm-source-wikipedia-suggest
- :buffer "*helm wikipedia*"))
-
-
-(provide 'helm-net)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-net.el ends here
+++ /dev/null
-;;; helm-org.el --- Helm for org headlines and keywords completion -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-utils)
-(require 'org)
-
-(declare-function org-agenda-switch-to "org-agenda.el")
-
-(defgroup helm-org nil
- "Org related functions for helm."
- :group 'helm)
-
-(defcustom helm-org-headings-fontify nil
- "Fontify org buffers before parsing them.
-This reflect fontification in helm-buffer when non--nil.
-NOTE: This will be slow on large org buffers."
- :group 'helm-org
- :type 'boolean)
-
-(defcustom helm-org-format-outline-path nil
- "Show all org level as path."
- :group 'helm-org
- :type 'boolean)
-
-(defcustom helm-org-show-filename nil
- "Show org filenames in `helm-org-agenda-files-headings' when non--nil.
-Note this have no effect in `helm-org-in-buffer-headings'."
- :group 'helm-org
- :type 'boolean)
-
-(defcustom helm-org-headings-min-depth 1
- "Minimum depth of org headings to start with."
- :group 'helm-org
- :type 'integer)
-
-(defcustom helm-org-headings-max-depth 8
- "Go down to this maximum depth of org headings."
- :group 'helm-org
- :type 'integer)
-
-(defcustom helm-org-headings-actions
- '(("Go to heading" . helm-org-goto-marker)
- ("Open in indirect buffer `C-RET'" . helm-org--open-heading-in-indirect-buffer)
- ("Refile to this heading `C-w`''" . helm-org-heading-refile)
- ("Insert link to this heading `C-l`''" . helm-org-insert-link-to-heading-at-marker))
- "Default actions alist for
- `helm-source-org-headings-for-files'."
- :group 'helm-org
- :type '(alist :key-type string :value-type function))
-
-(defcustom helm-org-truncate-lines t
- "Truncate org-header-lines when non-nil"
- :type 'boolean
- :group 'helm-org)
-
-;;; Org capture templates
-;;
-;;
-(defvar org-capture-templates)
-(defun helm-source-org-capture-templates ()
- (helm-build-sync-source "Org Capture Templates:"
- :candidates (cl-loop for template in org-capture-templates
- collect (cons (nth 1 template) (nth 0 template)))
- :action '(("Do capture" . (lambda (template-shortcut)
- (org-capture nil template-shortcut))))))
-
-;;; Org headings
-;;
-;;
-(defun helm-org-goto-marker (marker)
- (switch-to-buffer (marker-buffer marker))
- (goto-char (marker-position marker))
- (org-show-context)
- (re-search-backward "^\\*+ " nil t)
- (org-show-entry))
-
-(defun helm-org--open-heading-in-indirect-buffer (marker)
- (helm-org-goto-marker marker)
- (org-tree-to-indirect-buffer)
-
- ;; Put the non-indirect buffer at the bottom of the prev-buffers
- ;; list so it won't be selected when the indirect buffer is killed
- (set-window-prev-buffers nil (append (cdr (window-prev-buffers))
- (car (window-prev-buffers)))))
-
-(defun helm-org--run-open-heading-in-indirect-buffer ()
- "Open selected Org heading in an indirect buffer."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action #'helm-org--open-heading-in-indirect-buffer)))
-(put 'helm-org--run-open-heading-in-indirect-buffer 'helm-only t)
-
-(defvar helm-org-headings-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "<C-return>") 'helm-org--run-open-heading-in-indirect-buffer)
- (define-key map (kbd "C-w") 'helm-org-heading-refile)
- (define-key map (kbd "C-l") 'helm-org-insert-link-to-heading-at-marker)
- map)
- "Keymap for `helm-source-org-headings-for-files'.")
-
-(defclass helm-org-headings-class (helm-source-sync)
- ((parents
- :initarg :parents
- :initform nil
- :custom boolean)
- (match :initform
- (lambda (candidate)
- (string-match
- helm-pattern
- (helm-aif (get-text-property 0 'helm-real-display candidate)
- it
- candidate))))
- (action :initform 'helm-org-headings-actions)
- (keymap :initform 'helm-org-headings-map)))
-
-(defmethod helm--setup-source :after ((source helm-org-headings-class))
- (let ((parents (slot-value source 'parents)))
- (set-slot-value source 'candidate-transformer
- (lambda (candidates)
- (let ((cands (helm-org-get-candidates candidates parents)))
- (if parents (nreverse cands) cands))))))
-
-(defun helm-source-org-headings-for-files (filenames &optional parents)
- (helm-make-source "Org Headings" helm-org-headings-class
- :parents parents
- :candidates filenames))
-
-(defun helm-org-get-candidates (filenames &optional parents)
- (apply #'append
- (mapcar (lambda (filename)
- (helm-org--get-candidates-in-file
- filename
- helm-org-headings-fontify
- (or parents (null helm-org-show-filename))
- parents))
- filenames)))
-
-(defun helm-org--get-candidates-in-file (filename &optional fontify nofname parents)
- (with-current-buffer (pcase filename
- ((pred bufferp) filename)
- ((pred stringp) (find-file-noselect filename)))
- (let ((match-fn (if fontify
- #'match-string
- #'match-string-no-properties))
- (search-fn (lambda ()
- (re-search-forward
- org-complex-heading-regexp nil t)))
- (file (unless nofname
- (concat (helm-basename filename) ":"))))
- (when parents
- (add-function :around (var search-fn)
- (lambda (old-fn &rest args)
- (when (org-up-heading-safe)
- (apply old-fn args)))))
- (save-excursion
- (save-restriction
- (widen)
- (unless parents (goto-char (point-min)))
- (cl-loop with width = (window-width (helm-window))
- while (funcall search-fn)
- for beg = (point-at-bol)
- for end = (point-at-eol)
- when (and fontify
- (null (text-property-any
- beg end 'fontified t)))
- do (jit-lock-fontify-now beg end)
- for level = (length (match-string-no-properties 1))
- for heading = (funcall match-fn 4)
- if (and (>= level helm-org-headings-min-depth)
- (<= level helm-org-headings-max-depth))
- collect `(,(propertize
- (if helm-org-format-outline-path
- (org-format-outline-path
- (append (apply #'org-get-outline-path
- (unless parents
- (list t level heading)))
- (list heading))
- width file)
- (if file
- (concat file (funcall match-fn 0))
- (funcall match-fn 0)))
- 'helm-real-display heading)
- . ,(point-marker))))))))
-
-(defun helm-org-insert-link-to-heading-at-marker (marker)
- (with-current-buffer (marker-buffer marker)
- (let ((heading-name (save-excursion (goto-char (marker-position marker))
- (nth 4 (org-heading-components))))
- (file-name (buffer-file-name)))
- (with-helm-current-buffer
- (org-insert-link
- file-name (concat "file:" file-name "::*" heading-name))))))
-
-(defun helm-org-heading-refile (marker)
- (save-selected-window
- (when (eq major-mode 'org-agenda-mode)
- (org-agenda-switch-to))
- (org-cut-subtree)
- (let ((target-level (with-current-buffer (marker-buffer marker)
- (goto-char (marker-position marker))
- (org-current-level))))
- (helm-org-goto-marker marker)
- (org-end-of-subtree t t)
- (org-paste-subtree (+ target-level 1)))))
-
-;;;###autoload
-(defun helm-org-agenda-files-headings ()
- "Preconfigured helm for org files headings."
- (interactive)
- (helm :sources (helm-source-org-headings-for-files (org-agenda-files))
- :candidate-number-limit 99999
- :truncate-lines helm-org-truncate-lines
- :buffer "*helm org headings*"))
-
-;;;###autoload
-(defun helm-org-in-buffer-headings ()
- "Preconfigured helm for org buffer headings."
- (interactive)
- (let ((helm-org-show-filename nil))
- (helm :sources (helm-source-org-headings-for-files
- (list (current-buffer)))
- :candidate-number-limit 99999
- :truncate-lines helm-org-truncate-lines
- :buffer "*helm org inbuffer*")))
-
-;;;###autoload
-(defun helm-org-parent-headings ()
- "Preconfigured helm for org headings that are parents of the
-current heading."
- (interactive)
- ;; Use a large max-depth to ensure all parents are displayed.
- (let ((helm-org-headings-min-depth 1)
- (helm-org-headings-max-depth 50))
- (helm :sources (helm-source-org-headings-for-files
- (list (current-buffer)) t)
- :candidate-number-limit 99999
- :truncate-lines helm-org-truncate-lines
- :buffer "*helm org parent headings*")))
-
-;;;###autoload
-(defun helm-org-capture-templates ()
- "Preconfigured helm for org templates."
- (interactive)
- (helm :sources (helm-source-org-capture-templates)
- :candidate-number-limit 99999
- :truncate-lines helm-org-truncate-lines
- :buffer "*helm org capture templates*"))
-
-
-(provide 'helm-org)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-org.el ends here
+++ /dev/null
-(define-package "helm" "20160217.958" "Helm is an Emacs incremental and narrowing framework"
- '((emacs "24.3")
- (async "1.6")
- (popup "0.5.3")
- (helm-core "1.9.1"))
- :url "https://emacs-helm.github.io/helm/")
-;; Local Variables:
-;; no-byte-compile: t
-;; End:
+++ /dev/null
-;;; helm-plugin.el --- Helm plugins -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-utils)
-
-\f
-;;; Plug-in: `info-index'
-;;
-;;
-(defun helm-make-info-source (source file)
- `(,@source
- (name . ,(concat "Info Index: " file))
- (info-file . ,file)
- (init . helm-info-init)
- (display-to-real . helm-info-display-to-real)
- (get-line . buffer-substring)
- (candidates-in-buffer)
- (action ("Goto node" . helm-info-goto))))
-
-(defun helm-compile-source--info-index (source)
- (helm-aif (helm-interpret-value (assoc-default 'info-index source))
- (helm-make-info-source source it)
- source))
-
-(add-to-list 'helm-compile-source-functions 'helm-compile-source--info-index)
-
-(helm-document-attribute 'info-index "info-index plugin"
- " Create a source of info index very easily.
-
- Example:
-
- (defvar helm-source-info-wget '((info-index . \"wget\"))")
-
-\f
-;;; Plug-in: `candidates-file'
-;;
-;; List all lines in a file.
-(defun helm-compile-source--candidates-file (source)
- (if (assoc-default 'candidates-file source)
- `((init helm-p-candidates-file-init
- ,@(let ((orig-init (assoc-default 'init source)))
- (cond ((null orig-init) nil)
- ((functionp orig-init) (list orig-init))
- (t orig-init))))
- (candidates-in-buffer)
- ,@source)
- source))
-(add-to-list 'helm-compile-source-functions 'helm-compile-source--candidates-file)
-
-(defun helm-p-candidates-file-init ()
- (cl-destructuring-bind (file &optional updating)
- (helm-mklist (helm-attr 'candidates-file))
- (setq file (helm-interpret-value file))
- (with-current-buffer (helm-candidate-buffer 'global)
- (insert-file-contents file)
- (when updating
- (buffer-disable-undo)
- (font-lock-mode -1)
- (auto-revert-mode 1)))))
-
-(helm-document-attribute 'candidates-file "candidates-file plugin"
- " Use a file as the candidates buffer.
-
- 1st argument is a filename, string or function name or variable
- name. If optional 2nd argument is non-nil, the file is opened with
- `auto-revert-mode' enabled.
-
- Example:
-
- \(defvar helm-source-test-file
- '((name . \"test1\")
- (candidates-file \"~/.emacs.el\" t)))
-
- Will list all lines in .emacs.el.")
-
-\f
-;;; Plug-in: `persistent-help'
-;;
-;; Add help about persistent action in `helm-buffer' header.
-(defun helm-compile-source--persistent-help (source)
- (if (assoc 'header-line source)
- source
- (append source '((header-line . helm-persistent-help-string)))))
-(add-to-list 'helm-compile-source-functions 'helm-compile-source--persistent-help)
-
-(defun helm-persistent-help-string ()
- (substitute-command-keys
- (concat "\\<helm-map>\\[helm-execute-persistent-action]: "
- (or (helm-interpret-value (helm-attr 'persistent-help))
- (helm-aif (or (assoc-default
- 'persistent-action
- (helm-get-current-source))
- (assoc-default
- 'action (helm-get-current-source)))
- (cond ((symbolp it)
- (symbol-name it))
- ((listp it)
- (or (ignore-errors (caar it)) ""))))
- "")
- " (keeping session)")))
-
-\f
-;;; Document new attributes
-;;
-;;
-(helm-document-attribute 'persistent-help "persistent-help plug-in"
- " A string to explain persistent-action of this source. It also
- accepts a function or a variable name.")
-
-
-(provide 'helm-plugin)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-plugin ends here
+++ /dev/null
-;;; helm-regexp.el --- In buffer regexp searching and replacement for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-utils)
-(require 'helm-plugin)
-
-(declare-function helm-mm-split-pattern "helm-multi-match")
-
-\f
-(defgroup helm-regexp nil
- "Regexp related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-moccur-always-search-in-current nil
- "Helm multi occur always search in current buffer when non--nil."
- :group 'helm-regexp
- :type 'boolean)
-
-(defcustom helm-moccur-use-ioccur-style-keys t
- "Similar to `helm-grep-use-ioccur-style-keys' but for multi occur."
- :group 'helm-regexp
- :type 'boolean)
-
-(defcustom helm-moccur-auto-update-on-resume nil
- "Allow auto updating helm-(m)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."
- :group 'helm-regexp
- :type '(radio :tag "Allow auto updating helm-(m)occur buffer when outdated."
- (const :tag "Always update without asking" noask)
- (const :tag "Never update and do not signal buffer needs update" never)
- (const :tag "Don't update but signal buffer needs update" nil)
- (const :tag "Update after confirmation" t)))
-
-(defcustom helm-source-multi-occur-actions
- '(("Go to Line" . helm-moccur-goto-line)
- ("Goto line other window" . helm-moccur-goto-line-ow)
- ("Goto line new frame" . helm-moccur-goto-line-of))
- "Actions for helm-occur and helm-moccur."
- :group 'helm-regexp
- :type '(alist :key-type string :value-type function))
-
-(defcustom helm-moccur-truncate-lines t
- "When nil the (m)occur line that appears will not be truncated."
- :group 'helm-regexp
- :type 'boolean)
-
-\f
-(defface helm-moccur-buffer
- '((t (:foreground "DarkTurquoise" :underline t)))
- "Face used to highlight moccur buffer names."
- :group 'helm-regexp)
-
-(defface helm-resume-need-update
- '((t (:background "red")))
- "Face used to flash moccur buffer when it needs update."
- :group 'helm-regexp)
-
-\f
-(defvar helm-moccur-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-goto-next-file)
- (define-key map (kbd "M-<up>") 'helm-goto-precedent-file)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- (define-key map (kbd "C-c o") 'helm-moccur-run-goto-line-ow)
- (define-key map (kbd "C-c C-o") 'helm-moccur-run-goto-line-of)
- (define-key map (kbd "C-x C-s") 'helm-moccur-run-save-buffer)
- (when helm-moccur-use-ioccur-style-keys
- (define-key map (kbd "<right>") 'helm-execute-persistent-action)
- (define-key map (kbd "<left>") 'helm-moccur-run-default-action))
- (delq nil map))
- "Keymap used in Moccur source.")
-
-\f
-;; History vars
-(defvar helm-build-regexp-history nil)
-(defvar helm-occur-history nil)
-
-(defun helm-query-replace-regexp (_candidate)
- "Query replace regexp from `helm-regexp'.
-With a prefix arg replace only matches surrounded by word boundaries,
-i.e Don't replace inside a word, regexp is surrounded with \\bregexp\\b."
- (let ((regexp helm-input))
- (apply 'query-replace-regexp
- (helm-query-replace-args regexp))))
-
-(defun helm-kill-regexp-as-sexp (_candidate)
- "Kill regexp in a format usable in lisp code."
- (helm-regexp-kill-new
- (prin1-to-string helm-input)))
-
-(defun helm-kill-regexp (_candidate)
- "Kill regexp as it is in `helm-pattern'."
- (helm-regexp-kill-new helm-input))
-
-(defun helm-query-replace-args (regexp)
- "create arguments of `query-replace-regexp' action in `helm-regexp'."
- (let ((region-only (helm-region-active-p)))
- (list
- regexp
- (query-replace-read-to regexp
- (format "Query replace %sregexp %s"
- (if helm-current-prefix-arg "word " "")
- (if region-only "in region " ""))
- t)
- helm-current-prefix-arg
- (when region-only (region-beginning))
- (when region-only (region-end)))))
-
-(defvar helm-source-regexp
- (helm-build-in-buffer-source "Regexp Builder"
- :init (lambda ()
- (helm-init-candidates-in-buffer
- 'global (with-temp-buffer
- (insert-buffer-substring helm-current-buffer)
- (buffer-string))))
- :get-line #'helm-regexp-get-line
- :persistent-action #'helm-regexp-persistent-action
- :persistent-help "Show this line"
- :multiline t
- :matchplugin nil
- :requires-pattern 2
- :mode-line "Press TAB to select action."
- :action '(("Kill Regexp as sexp" . helm-kill-regexp-as-sexp)
- ("Query Replace Regexp (C-u Not inside word.)"
- . helm-query-replace-regexp)
- ("Kill Regexp" . helm-kill-regexp))))
-
-(defun helm-regexp-get-line (s e)
- (let ((matches (match-data))
- (line (buffer-substring s e)))
- (propertize
- (cl-loop with ln = (format "%5d: %s" (1- (line-number-at-pos s)) line)
- for i from 0 to (1- (/ (length matches) 2))
- concat (format "\n %s'%s'" (format "Group %d: " i)
- (match-string i))
- into ln1
- finally return (concat ln ln1))
- 'helm-realvalue s)))
-
-(defun helm-regexp-persistent-action (pt)
- (helm-goto-char pt)
- (helm-highlight-current-line))
-
-(defun helm-regexp-kill-new (input)
- (kill-new input)
- (message "Killed: %s" input))
-
-\f
-;;; Occur
-;;
-;;
-(defvar helm-source-occur nil)
-(defun helm-occur-init-source ()
- (unless helm-source-occur
- (setq helm-source-occur
- (helm-make-source "Occur" 'helm-source-multi-occur))))
-
-\f
-;;; Multi occur
-;;
-;;
-
-;; Internal
-(defvar helm-multi-occur-buffer-list nil)
-(defvar helm-multi-occur-buffer-tick nil)
-(defun helm-moccur-init ()
- "Create the initial helm multi occur buffer."
- (helm-init-candidates-in-buffer
- 'global
- (cl-loop with buffers = (helm-attr 'moccur-buffers)
- for buf in buffers
- for bufstr = (with-current-buffer buf (buffer-string))
- do (add-text-properties
- 0 (length bufstr)
- `(buffer-name ,(buffer-name (get-buffer buf)))
- bufstr)
- concat bufstr)))
-
-(defun helm-moccur--next-or-previous-char ()
- (save-excursion
- (or (re-search-forward "^." nil t)
- (re-search-backward "^." nil t))))
-
-(defun helm-moccur-get-line (beg end)
- "Format line for `helm-source-moccur'."
- (prog1
- (format "%s:%d:%s"
- (get-text-property (if (= beg end)
- (helm-moccur--next-or-previous-char)
- beg)
- 'buffer-name)
- (save-restriction
- (narrow-to-region (or (previous-single-property-change
- (point) 'buffer-name) 1)
- (or (next-single-property-change
- (if (= beg end)
- (helm-moccur--next-or-previous-char)
- (point))
- 'buffer-name)
- (point-max)))
- (line-number-at-pos beg))
- ;; When matching empty line, use empty string
- ;; to allow saving and modifying with wgrep.
- (if (= beg end) "" (buffer-substring beg end)))
- ;; When matching empty line, forward char ("\n")
- ;; to not be blocked forever here.
- (when (= beg end) (forward-char 1))))
-
-(cl-defun helm-moccur-action (candidate
- &optional (method (quote buffer)) mark)
- "Jump to CANDIDATE with METHOD.
-arg METHOD can be one of buffer, buffer-other-window, buffer-other-frame."
- (require 'helm-grep)
- (let* ((split (helm-grep-split-line candidate))
- (buf (car split))
- (lineno (string-to-number (nth 1 split)))
- (split-pat (helm-mm-split-pattern helm-input)))
- (cl-case method
- (buffer (switch-to-buffer buf))
- (buffer-other-window (switch-to-buffer-other-window buf))
- (buffer-other-frame (switch-to-buffer-other-frame buf)))
- (helm-goto-line lineno)
- ;; Move point to the nearest matching regexp from bol.
- (cl-loop for reg in split-pat
- when (save-excursion
- (condition-case _err
- (if helm-migemo-mode
- (helm-mm-migemo-forward reg (point-at-eol) t)
- (re-search-forward reg (point-at-eol) t))
- (invalid-regexp nil)))
- collect (match-beginning 0) into pos-ls
- finally (when pos-ls (goto-char (apply #'min pos-ls))))
- (when mark
- (set-marker (mark-marker) (point))
- (push-mark (point) 'nomsg))))
-
-(defun helm-moccur-persistent-action (candidate)
- (helm-moccur-goto-line candidate)
- (helm-highlight-current-line))
-
-(defun helm-moccur-goto-line (candidate)
- "From multi occur, switch to buffer and go to nth 1 CANDIDATE line."
- (helm-moccur-action
- candidate 'buffer (or current-prefix-arg ; persistent.
- helm-current-prefix-arg))) ; exit.
-
-(defun helm-moccur-goto-line-ow (candidate)
- "Go to CANDIDATE line in other window.
-Same as `helm-moccur-goto-line' but go in other window."
- (helm-moccur-action
- candidate 'buffer-other-window
- (or current-prefix-arg ; persistent.
- helm-current-prefix-arg))) ; exit.
-
-(defun helm-moccur-goto-line-of (candidate)
- "Go to CANDIDATE line in new frame.
-Same as `helm-moccur-goto-line' but go in new frame."
- (helm-moccur-action
- candidate 'buffer-other-frame
- (or current-prefix-arg ; persistent.
- helm-current-prefix-arg))) ; exit.
-
-(defun helm-moccur-run-goto-line-ow ()
- "Run goto line other window action from `helm-source-moccur'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-moccur-goto-line-ow)))
-(put 'helm-moccur-run-goto-line-ow 'helm-only t)
-
-(defun helm-moccur-run-goto-line-of ()
- "Run goto line new frame action from `helm-source-moccur'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-moccur-goto-line-of)))
-(put 'helm-moccur-run-goto-line-of 'helm-only t)
-
-(defun helm-moccur-run-default-action ()
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-moccur-goto-line)))
-(put 'helm-moccur-run-default-action 'helm-only t)
-
-(defvar helm-source-moccur nil)
-(defclass helm-source-multi-occur (helm-source-in-buffer)
- ((init :initform (lambda ()
- (require 'helm-grep)
- (helm-moccur-init)))
- (filter-one-by-one :initform 'helm-moccur-filter-one-by-one)
- (get-line :initform helm-moccur-get-line)
- (nohighlight :initform t)
- (nomark :initform t)
- (migemo :initform t)
- (action :initform 'helm-source-multi-occur-actions)
- (persistent-action :initform 'helm-moccur-persistent-action)
- (persistent-help :initform "Go to line")
- (resume :initform 'helm-moccur-resume-fn)
- (candidate-number-limit :initform 9999)
- (help-message :initform 'helm-moccur-help-message)
- (keymap :initform helm-moccur-map)
- (history :initform 'helm-occur-history)
- (requires-pattern :initform 2)))
-
-(defun helm-moccur-resume-fn ()
- (with-helm-buffer
- (let (new-tick-ls buffer-is-modified)
- (set (make-local-variable 'helm-multi-occur-buffer-list)
- (cl-loop for b in helm-multi-occur-buffer-list
- when (buffer-live-p (get-buffer b))
- collect b))
- (setq buffer-is-modified (/= (length helm-multi-occur-buffer-list)
- (length (helm-attr 'moccur-buffers))))
- (helm-attrset 'moccur-buffers helm-multi-occur-buffer-list)
- (setq new-tick-ls (cl-loop for b in helm-multi-occur-buffer-list
- collect (buffer-chars-modified-tick (get-buffer b))))
- (when buffer-is-modified
- (setq helm-multi-occur-buffer-tick new-tick-ls))
- (cl-assert (> (length helm-multi-occur-buffer-list) 0) nil
- "helm-resume error: helm-(m)occur buffer list is empty")
- (unless (eq helm-moccur-auto-update-on-resume 'never)
- (when (or buffer-is-modified
- (cl-loop for b in helm-multi-occur-buffer-list
- for new-tick = (buffer-chars-modified-tick (get-buffer b))
- for tick in helm-multi-occur-buffer-tick
- thereis (/= tick new-tick)))
- (helm-aif helm-moccur-auto-update-on-resume
- (when (or (eq it 'noask)
- (y-or-n-p "Helm (m)occur Buffer outdated, update? "))
- (run-with-idle-timer 0.1 nil (lambda ()
- (with-helm-buffer
- (helm-force-update)
- (message "Helm (m)occur Buffer have been udated")
- (sit-for 1) (message nil))))
- (unless buffer-is-modified (setq helm-multi-occur-buffer-tick new-tick-ls)))
- (run-with-idle-timer 0.1 nil (lambda ()
- (with-helm-buffer
- (let ((ov (make-overlay (save-excursion
- (goto-char (point-min))
- (forward-line 1)
- (point))
- (point-max))))
- (overlay-put ov 'face 'helm-resume-need-update)
- (sit-for 0.3) (delete-overlay ov)
- (message "[Helm occur Buffer outdated (C-c C-u to update)]")))))
- (unless buffer-is-modified
- (with-helm-after-update-hook
- (setq helm-multi-occur-buffer-tick new-tick-ls)
- (message "Helm (m)occur Buffer have been udated")))))))))
-
-(defun helm-moccur-filter-one-by-one (candidate)
- "`filter-one-by-one' function for `helm-source-moccur'."
- (require 'helm-grep)
- (let* ((split (helm-grep-split-line candidate))
- (buf (car split))
- (lineno (nth 1 split))
- (str (nth 2 split)))
- (cons (concat (propertize
- buf
- 'face 'helm-moccur-buffer
- 'help-echo (buffer-file-name
- (get-buffer buf))
- 'buffer-name buf)
- ":"
- (propertize lineno 'face 'helm-grep-lineno)
- ":"
- (helm-grep-highlight-match str t))
- candidate)))
-
-(defun helm-multi-occur-1 (buffers &optional input)
- "Main function to call `helm-source-moccur' with BUFFERS list."
- (let ((bufs (if helm-moccur-always-search-in-current
- (cons
- ;; will become helm-current-buffer later.
- (buffer-name (current-buffer))
- (remove helm-current-buffer buffers))
- buffers)))
- (unless helm-source-moccur
- (setq helm-source-moccur
- (helm-make-source "Moccur" 'helm-source-multi-occur)))
- (helm-attrset 'moccur-buffers bufs helm-source-moccur)
- (helm-set-local-variable 'helm-multi-occur-buffer-list bufs)
- (helm-set-local-variable
- 'helm-multi-occur-buffer-tick
- (cl-loop for b in bufs
- collect (buffer-chars-modified-tick (get-buffer b)))))
- (helm :sources 'helm-source-moccur
- :buffer "*helm multi occur*"
- :history 'helm-occur-history
- :keymap helm-moccur-map
- :input input
- :truncate-lines helm-moccur-truncate-lines))
-
-(defun helm-moccur-run-save-buffer ()
- "Run moccur save results action from `helm-moccur'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action 'helm-moccur-save-results)))
-(put 'helm-moccur-run-save-buffer 'helm-only t)
-
-\f
-;;; helm-moccur-mode
-;;
-;;
-(defvar helm-moccur-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map (kbd "RET") 'helm-moccur-mode-goto-line)
- (define-key map (kbd "C-o") 'helm-moccur-mode-goto-line-ow)
- (define-key map (kbd "<C-down>") 'helm-moccur-mode-goto-line-ow-forward)
- (define-key map (kbd "<C-up>") 'helm-moccur-mode-goto-line-ow-backward)
- (define-key map (kbd "<M-down>") 'helm-gm-next-file)
- (define-key map (kbd "<M-up>") 'helm-gm-precedent-file)
- (define-key map (kbd "M-n") 'helm-moccur-mode-goto-line-ow-forward)
- (define-key map (kbd "M-p") 'helm-moccur-mode-goto-line-ow-backward)
- (define-key map (kbd "M-N") 'helm-gm-next-file)
- (define-key map (kbd "M-P") 'helm-gm-precedent-file)
- map))
-
-(defun helm-moccur-mode-goto-line ()
- (interactive)
- (helm-aif (get-text-property (point) 'helm-realvalue)
- (helm-moccur-goto-line it)))
-
-(defun helm-moccur-mode-goto-line-ow ()
- (interactive)
- (helm-aif (get-text-property (point) 'helm-realvalue)
- (helm-moccur-goto-line-ow it)))
-
-(defun helm-moccur-mode-goto-line-ow-forward-1 (arg)
- (condition-case nil
- (progn
- (save-selected-window
- (helm-moccur-mode-goto-line-ow)
- (recenter))
- (forward-line arg))
- (error nil)))
-
-(defun helm-moccur-mode-goto-line-ow-forward ()
- (interactive)
- (helm-moccur-mode-goto-line-ow-forward-1 1))
-
-(defun helm-moccur-mode-goto-line-ow-backward ()
- (interactive)
- (helm-moccur-mode-goto-line-ow-forward-1 -1))
-
-(defun helm-moccur-save-results (_candidate)
- "Save helm moccur results in a `helm-moccur-mode' buffer."
- (let ((buf "*hmoccur*")
- new-buf)
- (when (get-buffer buf)
- (setq new-buf (helm-read-string "OccurBufferName: " buf))
- (cl-loop for b in (helm-buffer-list)
- when (and (string= new-buf b)
- (not (y-or-n-p
- (format "Buffer `%s' already exists overwrite? "
- new-buf))))
- do (setq new-buf (helm-read-string "OccurBufferName: " "*hmoccur ")))
- (setq buf new-buf))
- (with-current-buffer (get-buffer-create buf)
- (setq buffer-read-only t)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert "-*- mode: helm-moccur -*-\n\n"
- (format "Moccur Results for `%s':\n\n" helm-input))
- (save-excursion
- (insert (with-current-buffer helm-buffer
- (goto-char (point-min)) (forward-line 1)
- (buffer-substring (point) (point-max))))))
- (helm-moccur-mode) (pop-to-buffer buf))
- (message "Helm Moccur Results saved in `%s' buffer" buf)))
-
-;;;###autoload
-(define-derived-mode helm-moccur-mode
- special-mode "helm-moccur"
- "Major mode to provide actions in helm moccur saved buffer.
-
-Special commands:
-\\{helm-moccur-mode-map}"
- (set (make-local-variable 'helm-multi-occur-buffer-list)
- (with-helm-buffer helm-multi-occur-buffer-list))
- (set (make-local-variable 'revert-buffer-function)
- #'helm-moccur-mode--revert-buffer-function))
-
-(defun helm-moccur-mode--revert-buffer-function (&optional _ignore-auto _noconfirm)
- (goto-char (point-min))
- (let (pattern)
- (when (re-search-forward "^Moccur Results for `\\(.*\\)'" nil t)
- (setq pattern (match-string 1))
- (forward-line 0)
- (when (re-search-forward "^$" nil t)
- (forward-line 1))
- (let ((inhibit-read-only t)
- (buffer (current-buffer))
- (buflst helm-multi-occur-buffer-list))
- (delete-region (point) (point-max))
- (message "Reverting buffer...")
- (save-excursion
- (with-temp-buffer
- (insert
- "\n"
- (cl-loop for buf in buflst
- for bufstr = (or (and (buffer-live-p (get-buffer buf))
- (with-current-buffer buf
- (buffer-string)))
- "")
- unless (string= bufstr "")
- do (add-text-properties
- 0 (length bufstr)
- `(buffer-name ,(buffer-name (get-buffer buf)))
- bufstr)
- concat bufstr)
- "\n")
- (goto-char (point-min))
- (cl-loop while (re-search-forward pattern nil t)
- for line = (helm-moccur-get-line (point-at-bol) (point-at-eol))
- when line
- do (with-current-buffer buffer
- (insert
- (propertize
- (car (helm-moccur-filter-one-by-one line))
- 'helm-realvalue line)
- "\n")))))
- (message "Reverting buffer done")))))
-
-\f
-;;; Predefined commands
-;;
-;;
-
-;;;###autoload
-(defun helm-regexp ()
- "Preconfigured helm to build regexps.
-`query-replace-regexp' can be run from there against found regexp."
- (interactive)
- (save-restriction
- (when (and (helm-region-active-p)
- ;; Don't narrow to region if buffer is already narrowed.
- (not (helm-current-buffer-narrowed-p (current-buffer))))
- (narrow-to-region (region-beginning) (region-end)))
- (helm :sources helm-source-regexp
- :buffer "*helm regexp*"
- :prompt "Regexp: "
- :history 'helm-build-regexp-history)))
-
-;;;###autoload
-(defun helm-occur ()
- "Preconfigured helm for Occur."
- (interactive)
- (helm-occur-init-source)
- (let ((bufs (list (buffer-name (current-buffer)))))
- (helm-attrset 'moccur-buffers bufs helm-source-occur)
- (helm-set-local-variable 'helm-multi-occur-buffer-list bufs)
- (helm-set-local-variable
- 'helm-multi-occur-buffer-tick
- (cl-loop for b in bufs
- collect (buffer-chars-modified-tick (get-buffer b)))))
- (helm :sources 'helm-source-occur
- :buffer "*helm occur*"
- :history 'helm-occur-history
- :preselect (and (memq 'helm-source-occur helm-sources-using-default-as-input)
- (format "%s:%d:" (regexp-quote (buffer-name))
- (line-number-at-pos (point))))
- :truncate-lines helm-moccur-truncate-lines))
-
-;;;###autoload
-(defun helm-occur-from-isearch ()
- "Invoke `helm-occur' from isearch."
- (interactive)
- (let ((input (if isearch-regexp
- isearch-string
- (regexp-quote isearch-string)))
- (bufs (list (buffer-name (current-buffer)))))
- (isearch-exit)
- (helm-occur-init-source)
- (helm-attrset 'moccur-buffers bufs helm-source-occur)
- (helm-set-local-variable 'helm-multi-occur-buffer-list bufs)
- (helm-set-local-variable
- 'helm-multi-occur-buffer-tick
- (cl-loop for b in bufs
- collect (buffer-chars-modified-tick (get-buffer b))))
- (helm :sources 'helm-source-occur
- :buffer "*helm occur*"
- :history 'helm-occur-history
- :input input
- :truncate-lines helm-moccur-truncate-lines)))
-
-;;;###autoload
-(defun helm-multi-occur-from-isearch (&optional _arg)
- "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."
- (interactive "p")
- (let (buf-list
- helm-moccur-always-search-in-current
- (input (if isearch-regexp
- isearch-string
- (regexp-quote isearch-string))))
- (isearch-exit)
- (setq buf-list (helm-comp-read "Buffers: "
- (helm-buffer-list)
- :name "Occur in buffer(s)"
- :marked-candidates t))
- (setq helm-moccur-always-search-in-current
- (if (or current-prefix-arg
- helm-current-prefix-arg)
- (not helm-moccur-always-search-in-current)
- helm-moccur-always-search-in-current))
- (helm-multi-occur-1 buf-list input)))
-
-
-(provide 'helm-regexp)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-regexp.el ends here
+++ /dev/null
-;;; helm-ring.el --- kill-ring, mark-ring, and register browsers for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-utils)
-(require 'helm-help)
-(require 'helm-elisp)
-
-(declare-function undo-tree-restore-state-from-register "ext:undo-tree.el" (register))
-
-\f
-(defgroup helm-ring nil
- "Ring related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-kill-ring-threshold 3
- "Minimum length of a candidate to be listed by `helm-source-kill-ring'."
- :type 'integer
- :group 'helm-ring)
-
-(defcustom helm-kill-ring-max-lines-number 5
- "Max number of lines displayed per candidate in kill-ring browser.
-If nil or zero (disabled), don't truncate candidate, show all."
- :type '(choice (const :tag "Disabled" nil)
- (integer :tag "Max number of lines"))
- :group 'helm-ring)
-
-(defcustom helm-register-max-offset 160
- "Max size of string register entries before truncating."
- :group 'helm-ring
- :type 'integer)
-
-(defcustom helm-kill-ring-actions
- '(("Yank" . helm-kill-ring-action)
- ("Delete" . (lambda (_candidate)
- (cl-loop for cand in (helm-marked-candidates)
- do (setq kill-ring
- (delete cand kill-ring))))))
- "List of actions for kill ring source."
- :group 'helm-ring
- :type '(alist :key-type string :value-type function))
-
-\f
-;;; Kill ring
-;;
-;;
-(defvar helm-kill-ring-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-y") 'helm-next-line)
- (define-key map (kbd "M-u") 'helm-previous-line)
- map)
- "Keymap for `helm-show-kill-ring'.")
-
-(defvar helm-source-kill-ring
- (helm-build-sync-source "Kill Ring"
- :init (lambda () (helm-attrset 'last-command last-command))
- :candidates #'helm-kill-ring-candidates
- :filtered-candidate-transformer #'helm-kill-ring-transformer
- :action 'helm-kill-ring-actions
- :persistent-action (lambda (_candidate) (ignore))
- :persistent-help "DoNothing"
- :keymap helm-kill-ring-map
- :migemo t
- :multiline t)
- "Source for browse and insert contents of kill-ring.")
-
-(defun helm-kill-ring-candidates ()
- (cl-loop for kill in (helm-fast-remove-dups kill-ring :test 'equal)
- unless (or (< (length kill) helm-kill-ring-threshold)
- (string-match "\\`[\n[:blank:]]+\\'" kill))
- collect kill))
-
-(defun helm-kill-ring-transformer (candidates _source)
- "Display only the `helm-kill-ring-max-lines-number' lines of candidate."
- (cl-loop for i in candidates
- when (get-text-property 0 'read-only i)
- do (set-text-properties 0 (length i) '(read-only nil) i)
- for nlines = (with-temp-buffer (insert i) (count-lines (point-min) (point-max)))
- if (and helm-kill-ring-max-lines-number
- (> nlines helm-kill-ring-max-lines-number))
- collect (cons
- (with-temp-buffer
- (insert i)
- (goto-char (point-min))
- (concat
- (buffer-substring
- (point-min)
- (save-excursion
- (forward-line helm-kill-ring-max-lines-number)
- (point)))
- "[...]")) i)
- else collect i))
-
-(defun helm-kill-ring-action (str)
- "Insert STR in `kill-ring' and set STR to the head.
-If this action is executed just after `yank',
-replace with STR as yanked string."
- (with-helm-current-buffer
- (setq kill-ring (delete str kill-ring))
- (if (not (eq (helm-attr 'last-command helm-source-kill-ring) 'yank))
- (insert-for-yank str)
- ;; from `yank-pop'
- (let ((inhibit-read-only t)
- (before (< (point) (mark t))))
- (if before
- (funcall (or yank-undo-function 'delete-region) (point) (mark t))
- (funcall (or yank-undo-function 'delete-region) (mark t) (point)))
- (setq yank-undo-function nil)
- (set-marker (mark-marker) (point) helm-current-buffer)
- (insert-for-yank str)
- ;; Set the window start back where it was in the yank command,
- ;; if possible.
- (set-window-start (selected-window) yank-window-start t)
- (when before
- ;; This is like exchange-point-and-mark, but doesn't activate the mark.
- ;; It is cleaner to avoid activation, even though the command
- ;; loop would deactivate the mark because we inserted text.
- (goto-char (prog1 (mark t)
- (set-marker (mark-marker) (point) helm-current-buffer))))))
- (kill-new str)))
-
-\f
-;;;; <Mark ring>
-;; DO NOT use these sources with other sources use
-;; the commands `helm-mark-ring', `helm-global-mark-ring' or
-;; `helm-all-mark-rings' instead.
-
-(defun helm-mark-ring-line-string-at-pos (pos)
- "Return line string at position POS."
- (save-excursion
- (goto-char pos)
- (forward-line 0)
- (let ((line (car (split-string (thing-at-point 'line) "[\n\r]"))))
- (if (string= "" line)
- "<EMPTY LINE>"
- line))))
-
-(defun helm-mark-ring-get-candidates ()
- (with-helm-current-buffer
- (cl-loop with marks = (if (mark t) (cons (mark-marker) mark-ring) mark-ring)
- for i in marks
- with max-line-number = (line-number-at-pos (point-max))
- with width = (length (number-to-string max-line-number))
- for m = (format (concat "%" (number-to-string width) "d: %s")
- (line-number-at-pos i)
- (helm-mark-ring-line-string-at-pos i))
- unless (and recip (member m recip))
- collect m into recip
- finally return recip)))
-
-(defvar helm-source-mark-ring
- (helm-build-sync-source "mark-ring"
- :candidates #'helm-mark-ring-get-candidates
- :action '(("Goto line"
- . (lambda (candidate)
- (helm-goto-line (string-to-number candidate)))))
- :persistent-action (lambda (candidate)
- (helm-goto-line (string-to-number candidate))
- (helm-highlight-current-line))
- :persistent-help "Show this line"))
-
-;;; Global-mark-ring
-(defvar helm-source-global-mark-ring
- (helm-build-sync-source "global-mark-ring"
- :candidates #'helm-global-mark-ring-get-candidates
- :action '(("Goto line"
- . (lambda (candidate)
- (let ((items (split-string candidate ":")))
- (switch-to-buffer (cl-second items))
- (helm-goto-line (string-to-number (car items)))))))
- :persistent-action (lambda (candidate)
- (let ((items (split-string candidate ":")))
- (switch-to-buffer (cl-second items))
- (helm-goto-line (string-to-number (car items)))
- (helm-highlight-current-line)))
- :persistent-help "Show this line"))
-
-(defun helm-global-mark-ring-format-buffer (marker)
- (with-current-buffer (marker-buffer marker)
- (goto-char marker)
- (forward-line 0)
- (let ((line (pcase (thing-at-point 'line)
- ((and line (pred stringp)
- (guard (not (string-match-p "\\`\n?\\'" line))))
- (car (split-string line "[\n\r]")))
- (_ "<EMPTY LINE>"))))
- (format "%7d:%s: %s"
- (line-number-at-pos) (marker-buffer marker) line))))
-
-(defun helm-global-mark-ring-get-candidates ()
- (let ((marks global-mark-ring))
- (when marks
- (cl-loop for i in marks
- for mb = (marker-buffer i)
- for gm = (unless (or (string-match "^ " (format "%s" mb))
- (null mb))
- (helm-global-mark-ring-format-buffer i))
- when (and gm (not (member gm recip)))
- collect gm into recip
- finally return recip))))
-
-(defun helm--push-mark (&optional location nomsg activate)
- "[Internal] Don't use directly, use instead `helm-push-mark-mode'."
- (unless (null (mark t))
- (setq mark-ring (cons (copy-marker (mark-marker)) mark-ring))
- (when (> (length mark-ring) mark-ring-max)
- (move-marker (car (nthcdr mark-ring-max mark-ring)) nil)
- (setcdr (nthcdr (1- mark-ring-max) mark-ring) nil)))
- (set-marker (mark-marker) (or location (point)) (current-buffer))
- ;; Now push the mark on the global mark ring.
- (setq global-mark-ring (cons (copy-marker (mark-marker))
- ;; Avoid having multiple entries
- ;; for same buffer in `global-mark-ring'.
- (cl-loop with mb = (current-buffer)
- for m in global-mark-ring
- for nmb = (marker-buffer m)
- unless (eq mb nmb)
- collect m)))
- (when (> (length global-mark-ring) global-mark-ring-max)
- (move-marker (car (nthcdr global-mark-ring-max global-mark-ring)) nil)
- (setcdr (nthcdr (1- global-mark-ring-max) global-mark-ring) nil))
- (or nomsg executing-kbd-macro (> (minibuffer-depth) 0)
- (message "Mark set"))
- (when (or activate (not transient-mark-mode))
- (set-mark (mark t)))
- nil)
-
-(defadvice push-mark (around helm-push-mark-mode)
- (helm--push-mark location nomsg activate))
-
-;;;###autoload
-(define-minor-mode helm-push-mark-mode
- "Provide an improved version of `push-mark'.
-Modify the behavior of `push-mark' to update
-the `global-mark-ring' after each new visit."
- :group 'helm-ring
- :global t
- (if helm-push-mark-mode
- (if (fboundp 'advice-add)
- (advice-add 'push-mark :override #'helm--push-mark)
- (ad-activate 'push-mark))
- (if (fboundp 'advice-remove)
- (advice-remove 'push-mark #'helm--push-mark)
- (ad-deactivate 'push-mark))))
-\f
-;;;; <Register>
-;;; Insert from register
-(defvar helm-source-register
- (helm-build-sync-source "Registers"
- :candidates #'helm-register-candidates
- :action-transformer #'helm-register-action-transformer
- :persistent-help ""
- :multiline t
- :action '(("Delete Register(s)" .
- (lambda (_candidate)
- (cl-loop for candidate in (helm-marked-candidates)
- for register = (car candidate)
- do (setq register-alist
- (delq (assoc register register-alist)
- register-alist)))))))
- "See (info \"(emacs)Registers\")")
-
-(defun helm-register-candidates ()
- "Collecting register contents and appropriate commands."
- (cl-loop for (char . val) in register-alist
- for key = (single-key-description char)
- for string-actions =
- (cond
- ((numberp val)
- (list (int-to-string val)
- 'insert-register
- 'increment-register))
- ((markerp val)
- (let ((buf (marker-buffer val)))
- (if (null buf)
- (list "a marker in no buffer")
- (list (concat
- "a buffer position:"
- (buffer-name buf)
- ", position "
- (int-to-string (marker-position val)))
- 'jump-to-register
- 'insert-register))))
- ((and (consp val) (window-configuration-p (car val)))
- (list "window configuration."
- 'jump-to-register))
- ((and (vectorp val)
- (fboundp 'undo-tree-register-data-p)
- (undo-tree-register-data-p (elt val 1)))
- (list
- "Undo-tree entry."
- 'undo-tree-restore-state-from-register))
- ((or (and (vectorp val) (eq 'registerv (aref val 0)))
- (and (consp val) (frame-configuration-p (car val))))
- (list "frame configuration."
- 'jump-to-register))
- ((and (consp val) (eq (car val) 'file))
- (list (concat "file:"
- (prin1-to-string (cdr val))
- ".")
- 'jump-to-register))
- ((and (consp val) (eq (car val) 'file-query))
- (list (concat "file:a file-query reference: file "
- (car (cdr val))
- ", position "
- (int-to-string (car (cdr (cdr val))))
- ".")
- 'jump-to-register))
- ((consp val)
- (let ((lines (format "%4d" (length val))))
- (list (format "%s: %s\n" lines
- (truncate-string-to-width
- (mapconcat 'identity (list (car val))
- "^J") (- (window-width) 15)))
- 'insert-register)))
- ((stringp val)
- (list
- ;; without properties
- (concat (substring-no-properties
- val 0 (min (length val) helm-register-max-offset))
- (if (> (length val) helm-register-max-offset)
- "[...]" ""))
- 'insert-register
- 'append-to-register
- 'prepend-to-register)))
- unless (null string-actions) ; Fix Issue #1107.
- collect (cons (format "Register %3s:\n %s" key (car string-actions))
- (cons char (cdr string-actions)))))
-
-(defun helm-register-action-transformer (actions register-and-functions)
- "Decide actions by the contents of register."
- (cl-loop with transformer-actions = nil
- with func-actions =
- '((insert-register
- "Insert Register" .
- (lambda (c) (insert-register (car c))))
- (jump-to-register
- "Jump to Register" .
- (lambda (c) (jump-to-register (car c))))
- (append-to-register
- "Append Region to Register" .
- (lambda (c) (append-to-register
- (car c) (region-beginning) (region-end))))
- (prepend-to-register
- "Prepend Region to Register" .
- (lambda (c) (prepend-to-register
- (car c) (region-beginning) (region-end))))
- (increment-register
- "Increment Prefix Arg to Register" .
- (lambda (c) (increment-register
- helm-current-prefix-arg (car c))))
- (undo-tree-restore-state-from-register
- "Restore Undo-tree register" .
- (lambda (c) (and (fboundp 'undo-tree-restore-state-from-register)
- (undo-tree-restore-state-from-register (car c))))))
- for func in (cdr register-and-functions)
- for cell = (assq func func-actions)
- when cell
- do (push (cdr cell) transformer-actions)
- finally return (append (nreverse transformer-actions) actions)))
-
-;;;###autoload
-(defun helm-mark-ring ()
- "Preconfigured `helm' for `helm-source-mark-ring'."
- (interactive)
- (helm :sources 'helm-source-mark-ring
- :resume 'noresume
- :buffer "*helm mark*"))
-
-;;;###autoload
-(defun helm-global-mark-ring ()
- "Preconfigured `helm' for `helm-source-global-mark-ring'."
- (interactive)
- (helm :sources 'helm-source-global-mark-ring
- :resume 'noresume
- :buffer "*helm global mark*"))
-
-;;;###autoload
-(defun helm-all-mark-rings ()
- "Preconfigured `helm' for `helm-source-global-mark-ring' and \
-`helm-source-mark-ring'."
- (interactive)
- (helm :sources '(helm-source-mark-ring
- helm-source-global-mark-ring)
- :resume 'noresume
- :buffer "*helm mark ring*"))
-
-;;;###autoload
-(defun helm-register ()
- "Preconfigured `helm' for Emacs registers."
- (interactive)
- (helm :sources 'helm-source-register
- :resume 'noresume
- :buffer "*helm register*"))
-
-;;;###autoload
-(defun helm-show-kill-ring ()
- "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."
- (interactive)
- (let ((enable-recursive-minibuffers t))
- (helm :sources helm-source-kill-ring
- :buffer "*helm kill ring*"
- :resume 'noresume
- :allow-nest t)))
-
-;;;###autoload
-(defun 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."
- (interactive)
- (helm :sources
- (helm-build-sync-source "Kmacro"
- :candidates (lambda ()
- (helm-fast-remove-dups
- (cons (kmacro-ring-head)
- kmacro-ring)
- :test 'equal))
- :multiline t
- :candidate-transformer
- (lambda (candidates)
- (cl-loop for c in candidates collect
- (propertize (help-key-description (car c) nil)
- 'helm-realvalue c)))
- :persistent-help "Execute kmacro"
- :help-message 'helm-kmacro-help-message
- :action
- (helm-make-actions
- "Execute kmacro (`C-u <n>' to execute <n> times)"
- (lambda (candidate)
- (interactive)
- ;; Move candidate on top of list for next use.
- (setq kmacro-ring (delete candidate kmacro-ring))
- (kmacro-push-ring)
- (kmacro-split-ring-element candidate)
- (kmacro-exec-ring-item
- candidate helm-current-prefix-arg))))
- :buffer "*helm kmacro*"))
-
-(provide 'helm-ring)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-ring.el ends here
+++ /dev/null
-;;; helm-semantic.el --- Helm interface for Semantic -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Daniel Hackney <danNOSPAMhaxney.org>
-;; Author: Daniel Hackney <danNOSPAMhaxney.org>
-
-;; 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/>.
-
-;;; Commentary:
-
-;; Uses `candidates-in-buffer' for speed.
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'semantic)
-(require 'helm-help)
-(require 'helm-imenu)
-
-(declare-function pulse-momentary-highlight-one-line "pulse.el" (point &optional face))
-
-(defgroup helm-semantic nil
- "Semantic tags related libraries and applications for helm."
- :group 'helm)
-
-(defcustom helm-semantic-lynx-style-map t
- "Use Arrow keys to jump to occurences."
- :group 'helm-semantic
- :type 'boolean)
-
-(defcustom helm-semantic-display-style
- '((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))
- "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."
- :group 'helm-semantic
- :type '(alist :key-type symbol :value-type symbol))
-
-;;; keymap
-(defvar helm-semantic-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (when helm-semantic-lynx-style-map
- (define-key map (kbd "<left>") 'helm-maybe-exit-minibuffer)
- (define-key map (kbd "<right>") 'helm-execute-persistent-action))
- (delq nil map)))
-
-;; Internals vars
-(defvar helm-semantic--tags-cache nil)
-
-(defun helm-semantic--fetch-candidates (tags depth &optional class)
- "Write the contents of TAGS to the current buffer."
- (let ((class class) cur-type
- (stylefn (or (with-helm-current-buffer
- (assoc-default major-mode helm-semantic-display-style))
- #'semantic-format-tag-summarize)))
- (cl-dolist (tag tags)
- (when (listp tag)
- (cl-case (setq cur-type (semantic-tag-class tag))
- ((function variable type)
- (let ((spaces (make-string (* depth 2) ?\s))
- (type-p (eq cur-type 'type)))
- (unless (and (> depth 0) (not type-p))
- (setq class nil))
- (insert
- (if (and class (not type-p))
- (format "%s%s(%s) "
- spaces (if (< depth 2) "" "├►") class)
- spaces)
- ;; Save the tag for later
- (propertize (funcall stylefn tag nil t)
- 'semantic-tag tag)
- "\n")
- (and type-p (setq class (car tag)))
- ;; Recurse to children
- (unless (eq cur-type 'function)
- (helm-semantic--fetch-candidates
- (semantic-tag-components tag) (1+ depth) class))))
-
- ;; Don't do anything with packages or includes for now
- ((package include)
- (insert
- (propertize (funcall stylefn tag nil t)
- 'semantic-tag tag)
- "\n")
- )
- ;; Catch-all
- (t))))))
-
-(defun helm-semantic-default-action (_candidate &optional persistent)
- ;; By default, helm doesn't pass on the text properties of the selection.
- ;; Fix this.
- (helm-log-run-hook 'helm-goto-line-before-hook)
- (with-current-buffer helm-buffer
- (when (looking-at " ")
- (goto-char (next-single-property-change
- (point-at-bol) 'semantic-tag nil (point-at-eol))))
- (let ((tag (get-text-property (point) 'semantic-tag)))
- (semantic-go-to-tag tag)
- (unless persistent
- (pulse-momentary-highlight-one-line (point))))))
-
-(defun helm-semantic--maybe-set-needs-update ()
- (with-helm-current-buffer
- (when (semantic-parse-tree-needs-update-p)
- (semantic-parse-tree-set-needs-update))))
-
-(defvar helm-source-semantic nil)
-
-(defclass helm-semantic-source (helm-source-in-buffer)
- ((init :initform (lambda ()
- (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)))))
- (get-line :initform 'buffer-substring)
- (persistent-help :initform "Show this entry")
- (keymap :initform 'helm-semantic-map)
- (help-message :initform 'helm-semantic-help-message)
- (persistent-action :initform (lambda (elm)
- (helm-semantic-default-action elm t)
- (helm-highlight-current-line)))
- (action :initform 'helm-semantic-default-action)))
-
-(defcustom helm-semantic-fuzzy-match nil
- "Enable fuzzy matching in `helm-source-semantic'."
- :group 'helm-semantic
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-semantic
- (helm-make-source "Semantic Tags" 'helm-semantic-source
- :fuzzy-match helm-semantic-fuzzy-match))))
-
-;;;###autoload
-(defun helm-semantic (arg)
- "Preconfigured `helm' for `semantic'.
-If ARG is supplied, pre-select symbol at point instead of current"
- (interactive "P")
- (let ((tag (helm-aif (semantic-current-tag-parent)
- (cons (format "\\_<%s\\_>" (car it))
- (format "\\_<%s\\_>" (car (semantic-current-tag))))
- (format "\\_<%s\\_>" (car (semantic-current-tag))))))
- (unless helm-source-semantic
- (setq helm-source-semantic
- (helm-make-source "Semantic Tags" 'helm-semantic-source
- :fuzzy-match helm-semantic-fuzzy-match)))
- (helm :sources 'helm-source-semantic
- :candidate-number-limit 9999
- :preselect (if arg
- (thing-at-point 'symbol)
- tag)
- :buffer "*helm semantic*")))
-
-;;;###autoload
-(defun 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."
- (interactive "P")
- (unless helm-source-semantic
- (setq helm-source-semantic
- (helm-make-source "Semantic Tags" 'helm-semantic-source
- :fuzzy-match helm-semantic-fuzzy-match)))
- (unless helm-source-imenu
- (setq helm-source-imenu
- (helm-make-source "Imenu" 'helm-imenu-source
- :fuzzy-match helm-imenu-fuzzy-match)))
- (let* ((source (if (semantic-active-p)
- 'helm-source-semantic
- 'helm-source-imenu))
- (imenu-p (eq source 'helm-source-imenu))
- (imenu-auto-rescan imenu-p)
- (helm-execute-action-at-once-if-one
- (and imenu-p
- helm-imenu-execute-action-at-once-if-one))
- (tag (helm-aif (semantic-current-tag-parent)
- (cons (format "\\_<%s\\_>" (car it))
- (format "\\_<%s\\_>" (car (semantic-current-tag))))
- (format "\\_<%s\\_>" (car (semantic-current-tag))))))
- (helm :sources source
- :candidate-number-limit 9999
- :preselect (if (or arg imenu-p)
- (thing-at-point 'symbol)
- tag)
- :buffer "*helm semantic/imenu*")))
-
-(provide 'helm-semantic)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-semantic.el ends here
+++ /dev/null
-;;; helm-sys.el --- System related functions for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-utils)
-
-\f
-(defgroup helm-sys nil
- "System related helm library."
- :group 'helm)
-
-(defface helm-top-columns
- '((t :inherit helm-header))
- "Face for helm help string in minibuffer."
- :group 'helm-sys)
-
-\f
-(defun helm-top-command-set-fn (var _value)
- (set var
- (cl-case system-type
- (darwin "env COLUMNS=%s ps -axo pid,user,pri,nice,ucomm,tty,start,vsz,%%cpu,%%mem,etime,command")
- (t "env COLUMNS=%s top -b -n 1"))))
-
-(defcustom helm-top-command "env COLUMNS=%s top -b -n 1"
- "Top command used to display output of top.
-To use top command, a version supporting batch mode (-b option) is needed.
-On Mac OSX top command doesn't support this, so ps command
-is used by default instead.
-If you modify this the number and order of elements displayed
-should be the same as top command to have the sort commands
-working properly, that is 12 elements with the 2 first being
-PID and USER and the last 4 being %CPU, %MEM, TIME and COMMAND.
-A format string where %s will be replaced with `frame-width'."
- :group 'helm-sys
- :type 'string
- :set 'helm-top-command-set-fn)
-
-\f
-;;; Top (process)
-;;
-;;
-(defvar helm-top-sort-fn nil)
-(defvar helm-top-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-P") 'helm-top-run-sort-by-cpu)
- (define-key map (kbd "M-C") 'helm-top-run-sort-by-com)
- (define-key map (kbd "M-M") 'helm-top-run-sort-by-mem)
- (define-key map (kbd "M-U") 'helm-top-run-sort-by-user)
- map))
-
-(defvar helm-source-top
- (helm-build-in-buffer-source "Top"
- :header-name (lambda (name) (concat name " (Press C-c C-u to refresh)"))
- :init #'helm-top-init
- :nomark t
- :display-to-real #'helm-top-display-to-real
- :persistent-action #'helm-top-sh-persistent-action
- :persistent-help "SIGTERM"
- :help-message 'helm-top-help-message
- :follow 'never
- :keymap helm-top-map
- :filtered-candidate-transformer #'helm-top-sort-transformer
- :action-transformer #'helm-top-action-transformer))
-
-(defun helm-top-transformer (candidates _source)
- "Transformer for `helm-top'.
-Return empty string for non--valid candidates."
- (cl-loop for disp in candidates collect
- (cond ((string-match "^ *[0-9]+" disp) disp)
- ((string-match "^ *PID" disp)
- (cons (propertize disp 'face 'helm-top-columns) ""))
- (t (cons disp "")))))
-
-(defun helm-top-action-transformer (actions _candidate)
- "Action transformer for `top'.
-Show actions only on line starting by a PID."
- (let ((disp (helm-get-selection nil t)))
- (cond ((string-match "^ *[0-9]+" disp)
- (list '("kill (SIGTERM)" . (lambda (pid) (helm-top-sh "TERM" pid)))
- '("kill (SIGKILL)" . (lambda (pid) (helm-top-sh "KILL" pid)))
- '("kill (SIGINT)" . (lambda (pid) (helm-top-sh "INT" pid)))
- '("kill (Choose signal)"
- . (lambda (pid)
- (helm-top-sh
- (helm-comp-read (format "Kill [%s] with signal: " pid)
- '("ALRM" "HUP" "INT" "KILL" "PIPE" "POLL"
- "PROF" "TERM" "USR1" "USR2" "VTALRM"
- "STKFLT" "PWR" "WINCH" "CHLD" "URG"
- "TSTP" "TTIN" "TTOU" "STOP" "CONT"
- "ABRT" "FPE" "ILL" "QUIT" "SEGV"
- "TRAP" "SYS" "EMT" "BUS" "XCPU" "XFSZ")
- :must-match t)
- pid)))))
- (t actions))))
-
-(defun helm-top-sh (sig pid)
- "Run kill shell command with signal SIG on PID for `helm-top'."
- (let ((cmd (format "kill -%s %s" sig pid)))
- (message "Executed %s\n%s" cmd (shell-command-to-string cmd))))
-
-(defun helm-top-sh-persistent-action (pid)
- (delete-other-windows)
- (helm-top-sh "TERM" pid)
- (helm-force-update))
-
-(defun helm-top-init ()
- "Insert output of top command in candidate buffer."
- (unless helm-top-sort-fn (helm-top-set-mode-line "CPU"))
- (with-current-buffer (helm-candidate-buffer 'global)
- (call-process-shell-command
- (format helm-top-command (frame-width))
- nil (current-buffer))))
-
-(defun helm-top-display-to-real (line)
- "Return pid only from LINE."
- (car (split-string line)))
-
-;; Sort top command
-
-(defun helm-top-set-mode-line (str)
- (if (string-match "Sort:\\[\\(.*\\)\\] " helm-top-mode-line)
- (setq helm-top-mode-line (replace-match str nil nil helm-top-mode-line 1))
- (setq helm-top-mode-line (concat (format "Sort:[%s] " str) helm-top-mode-line))))
-
-(defun helm-top-sort-transformer (candidates source)
- (helm-top-transformer
- (if helm-top-sort-fn
- (cl-loop for c in candidates
- if (string-match "^ *[0-9]+" c)
- collect c into pid-cands
- else collect c into header-cands
- finally return (append
- header-cands
- (sort pid-cands helm-top-sort-fn)))
- candidates)
- source))
-
-(defun helm-top-sort-by-com (s1 s2)
- (let* ((split-1 (split-string s1))
- (split-2 (split-string s2))
- (com-1 (nth 11 split-1))
- (com-2 (nth 11 split-2)))
- (string< com-1 com-2)))
-
-(defun helm-top-sort-by-mem (s1 s2)
- (let* ((split-1 (split-string s1))
- (split-2 (split-string s2))
- (mem-1 (string-to-number (nth 9 split-1)))
- (mem-2 (string-to-number (nth 9 split-2))))
- (> mem-1 mem-2)))
-
-(defun helm-top-sort-by-user (s1 s2)
- (let* ((split-1 (split-string s1))
- (split-2 (split-string s2))
- (user-1 (nth 1 split-1))
- (user-2 (nth 1 split-2)))
- (string< user-1 user-2)))
-
-(defun helm-top-run-sort-by-com ()
- (interactive)
- (helm-top-set-mode-line "COM")
- (setq helm-top-sort-fn 'helm-top-sort-by-com)
- (helm-force-update))
-
-(defun helm-top-run-sort-by-cpu ()
- (interactive)
- (helm-top-set-mode-line "CPU")
- (setq helm-top-sort-fn nil)
- (helm-force-update))
-
-(defun helm-top-run-sort-by-mem ()
- (interactive)
- (helm-top-set-mode-line "MEM")
- (setq helm-top-sort-fn 'helm-top-sort-by-mem)
- (helm-force-update))
-
-(defun helm-top-run-sort-by-user ()
- (interactive)
- (helm-top-set-mode-line "USER")
- (setq helm-top-sort-fn 'helm-top-sort-by-user)
- (helm-force-update))
-
-\f
-;;; X RandR resolution change
-;;
-;;
-;;; FIXME I do not care multi-display.
-
-(defun helm-xrandr-info ()
- "Return a pair with current X screen number and current X display name."
- (with-temp-buffer
- (call-process "xrandr" nil (current-buffer) nil
- "--current")
- (let (screen output)
- (goto-char (point-min))
- (save-excursion
- (when (re-search-forward "\\(^Screen \\)\\([0-9]\\):" nil t)
- (setq screen (match-string 2))))
- (when (re-search-forward "^\\(.*\\) connected" nil t)
- (setq output (match-string 1)))
- (list screen output))))
-
-(defun helm-xrandr-screen ()
- "Return current X screen number."
- (car (helm-xrandr-info)))
-
-(defun helm-xrandr-output ()
- "Return current X display name."
- (cadr (helm-xrandr-info)))
-
-(defvar helm-source-xrandr-change-resolution
- '((name . "Change Resolution")
- (candidates
- . (lambda ()
- (with-temp-buffer
- (call-process "xrandr" nil (current-buffer) nil
- "--screen" (helm-xrandr-screen) "-q")
- (goto-char 1)
- (cl-loop with modes = nil
- while (re-search-forward " \\([0-9]+x[0-9]+\\)" nil t)
- for mode = (match-string 1)
- unless (member mode modes)
- collect mode into modes
- finally return modes))))
- (action
- ("Change Resolution"
- . (lambda (mode)
- (call-process "xrandr" nil nil nil
- "--screen" (helm-xrandr-screen)
- "--output" (helm-xrandr-output)
- "--mode" mode))))))
-
-\f
-;;; Emacs process
-;;
-;;
-(defvar helm-source-emacs-process
- '((name . "Emacs Process")
- (init . (lambda () (list-processes--refresh)))
- (candidates . (lambda () (mapcar #'process-name (process-list))))
- (persistent-action . (lambda (elm)
- (delete-process (get-process elm))
- (helm-delete-current-selection)))
- (persistent-help . "Kill Process")
- (action ("Kill Process" . (lambda (elm)
- (delete-process (get-process elm)))))))
-
-\f
-;;;###autoload
-(defun helm-top ()
- "Preconfigured `helm' for top command."
- (interactive)
- (save-window-excursion
- (unless helm-alive-p (delete-other-windows))
- (helm :sources 'helm-source-top
- :buffer "*helm top*" :full-frame t
- :candidate-number-limit 9999
- :preselect "^\\s-*[0-9]+")))
-
-;;;###autoload
-(defun helm-list-emacs-process ()
- "Preconfigured `helm' for emacs process."
- (interactive)
- (helm-other-buffer 'helm-source-emacs-process "*helm process*"))
-
-;;;###autoload
-(defun helm-xrandr-set ()
- "Preconfigured helm for xrandr."
- (interactive)
- (helm :sources 'helm-source-xrandr-change-resolution
- :buffer "*helm xrandr*"))
-
-(provide 'helm-sys)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-sys.el ends here
+++ /dev/null
-;;; helm-tags.el --- Helm for Etags. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'helm-utils)
-(require 'helm-grep)
-
-\f
-(defgroup helm-tags nil
- "Tags related Applications and libraries for Helm."
- :group 'helm)
-
-(defcustom helm-etags-tag-file-name "TAGS"
- "Etags tag file name."
- :type 'string
- :group 'helm-tags)
-
-(defcustom helm-etags-tag-file-search-limit 10
- "The limit level of directory to search tag file.
-Don't search tag file deeply if outside this value."
- :type 'number
- :group 'helm-tags)
-
-(defcustom helm-etags-match-part-only '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 only end part of tag (i.e \"foo\"),
-against only the tag part (i.e \"(defun foo\"),
-or against the whole candidate (i.e \"(filename: (defun foo\")."
- :type '(choice
- (const :tag "Match only tag" tag)
- (const :tag "Match last part of tag" endtag)
- (const :tag "Match all file+tag" all))
- :group 'helm-tags)
-
-(defcustom helm-etags-execute-action-at-once-if-one t
- "Whether to jump straight to the selected tag if there's only
-one match."
- :type 'boolean
- :group 'helm-tags)
-
-\f
-(defgroup helm-tags-faces nil
- "Customize the appearance of helm-tags faces."
- :prefix "helm-"
- :group 'helm-tags
- :group 'helm-faces)
-
-(defface helm-etags-file
- '((t (:foreground "Lightgoldenrod4"
- :underline t)))
- "Face used to highlight etags filenames."
- :group 'helm-tags-faces)
-
-\f
-;;; Etags
-;;
-;;
-(defun helm-etags-run-switch-other-window ()
- "Run switch to other window action from `helm-source-etags-select'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- (lambda (c)
- (helm-etags-action-goto 'find-file-other-window c)))))
-(put 'helm-etags-run-switch-other-window 'helm-only t)
-
-(defun helm-etags-run-switch-other-frame ()
- "Run switch to other frame action from `helm-source-etags-select'."
- (interactive)
- (with-helm-alive-p
- (helm-exit-and-execute-action
- (lambda (c)
- (helm-etags-action-goto 'find-file-other-frame c)))))
-(put 'helm-etags-run-switch-other-frame 'helm-only t)
-
-(defvar helm-etags-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map helm-map)
- (define-key map (kbd "M-<down>") 'helm-goto-next-file)
- (define-key map (kbd "M-<up>") 'helm-goto-precedent-file)
- (define-key map (kbd "C-w") 'helm-yank-text-at-point)
- (define-key map (kbd "C-c o") 'helm-etags-run-switch-other-window)
- (define-key map (kbd "C-c C-o") 'helm-etags-run-switch-other-frame)
- map)
- "Keymap used in Etags.")
-
-(defvar helm-etags-mtime-alist nil
- "Store the last modification time of etags files here.")
-(defvar helm-etags-cache (make-hash-table :test 'equal)
- "Cache content of etags files used here for faster access.")
-
-(defun helm-etags-get-tag-file (&optional directory)
- "Return the path of etags file if found.
-Lookes recursively in parents directorys for a
-`helm-etags-tag-file-name' file."
- ;; Get tag file from `default-directory' or upper directory.
- (let ((current-dir (helm-etags-find-tag-file-directory
- (or directory default-directory))))
- ;; Return nil if not find tag file.
- (when current-dir
- (expand-file-name helm-etags-tag-file-name current-dir))))
-
-(defun helm-etags-all-tag-files ()
- "Return files from the following sources;
- 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."
- (helm-fast-remove-dups
- (delq nil
- (append (list (helm-etags-get-tag-file)
- tags-file-name)
- tags-table-list))
- :test 'equal))
-
-(defun helm-etags-find-tag-file-directory (current-dir)
- "Try to find the directory containing tag file.
-If not found in CURRENT-DIR search in upper directory."
- (let ((file-exists? (lambda (dir)
- (let ((tag-path (expand-file-name
- helm-etags-tag-file-name dir)))
- (and (stringp tag-path)
- (file-regular-p tag-path)
- (file-readable-p tag-path))))))
- (cl-loop with count = 0
- until (funcall file-exists? current-dir)
- ;; Return nil if outside the value of
- ;; `helm-etags-tag-file-search-limit'.
- if (= count helm-etags-tag-file-search-limit)
- do (cl-return nil)
- ;; Or search upper directories.
- else
- do (cl-incf count)
- (setq current-dir (expand-file-name (concat current-dir "../")))
- finally return current-dir)))
-
-(defun helm-etags-get-header-name (_x)
- "Create header name for this helm etags session."
- (concat "Etags in "
- (with-helm-current-buffer
- (helm-etags-get-tag-file))))
-
-(defun helm-etags-create-buffer (file)
- "Create the `helm-buffer' based on contents of etags tag FILE."
- (let* (max
- (split (with-temp-buffer
- (insert-file-contents file)
- (prog1
- (split-string (buffer-string) "\n" 'omit-nulls)
- (setq max (line-number-at-pos (point-max))))))
- (progress-reporter (make-progress-reporter "Loading tag file..." 0 max)))
- (cl-loop
- with fname
- with cand
- for i in split for count from 0
- for elm = (unless (string-match "^\x0c" i) ;; "^L"
- (helm-aif (string-match "\177" i) ;; "^?"
- (substring i 0 it)
- i))
- for linum = (when (string-match "[0-9]+,?[0-9]*$" i)
- (car (split-string (match-string 0 i) ",")))
- do (cond ((and elm (string-match "^\\([^,]+\\),[0-9]+$" elm))
- (setq fname (propertize (match-string 1 elm)
- 'face 'helm-etags-file)))
- (elm (setq cand (format "%s:%s:%s" fname linum elm)))
- (t (setq cand nil)))
- when cand do (progn
- (insert (propertize (concat cand "\n") 'linum linum))
- (progress-reporter-update progress-reporter count)))))
-
-(defun helm-etags-init ()
- "Feed `helm-buffer' using `helm-etags-cache' or tag file.
-If no entry in cache, create one."
- (let ((tagfiles (helm-etags-all-tag-files)))
- (when tagfiles
- (with-current-buffer (helm-candidate-buffer 'global)
- (dolist (f tagfiles)
- (helm-aif (gethash f helm-etags-cache)
- ;; An entry is present in cache, insert it.
- (insert it)
- ;; No entry, create a new buffer using content of tag file (slower).
- (helm-etags-create-buffer f)
- ;; Store content of buffer in cache.
- (puthash f (buffer-string) helm-etags-cache)
- ;; Store or set the last modification of tag file.
- (helm-aif (assoc f helm-etags-mtime-alist)
- ;; If an entry exists modify it.
- (setcdr it (helm-etags-mtime f))
- ;; No entry create a new one.
- (add-to-list 'helm-etags-mtime-alist
- (cons f (helm-etags-mtime f))))))))))
-
-(defvar helm-source-etags-select nil
- "Helm source for Etags.")
-
-(defun helm-etags-build-source ()
- (helm-build-in-buffer-source "Etags"
- :header-name 'helm-etags-get-header-name
- :init 'helm-etags-init
- :get-line 'buffer-substring
- :match-part (lambda (candidate)
- ;; Match only the tag part of CANDIDATE
- ;; and not the filename.
- (cl-ecase helm-etags-match-part-only
- (endtag (cadr (split-string
- (cl-caddr (helm-grep-split-line candidate)))))
- (tag (cl-caddr (helm-grep-split-line candidate)))
- (all candidate)))
- :fuzzy-match helm-etags-fuzzy-match
- :help-message 'helm-etags-help-message
- :keymap helm-etags-map
- :action '(("Go to tag" . (lambda (c)
- (helm-etags-action-goto 'find-file c)))
- ("Go to tag in other window" . (lambda (c)
- (helm-etags-action-goto
- 'find-file-other-window
- c)))
- ("Go to tag in other frame" . (lambda (c)
- (helm-etags-action-goto
- 'find-file-other-frame
- c))))
- :persistent-help "Go to line"
- :persistent-action (lambda (candidate)
- (helm-etags-action-goto 'find-file candidate)
- (helm-highlight-current-line))))
-
-(defcustom helm-etags-fuzzy-match nil
- "Use fuzzy matching in `helm-etags-select'."
- :group 'helm-tags
- :type 'boolean
- :set (lambda (var val)
- (set var val)
- (setq helm-source-etags-select
- (helm-etags-build-source))))
-
-(defvar find-tag-marker-ring)
-
-(defun helm-etags-action-goto (switcher candidate)
- "Helm default action to jump to an etags entry in other window."
- (require 'etags)
- (helm-log-run-hook 'helm-goto-line-before-hook)
- (let* ((split (helm-grep-split-line candidate))
- (fname (cl-loop for tagf being the hash-keys of helm-etags-cache
- for f = (expand-file-name
- (car split) (file-name-directory tagf))
- when (file-exists-p f)
- return f))
- (elm (cl-caddr split))
- (linum (string-to-number (cadr split))))
- (if (null fname)
- (error "file %s not found" fname)
- (ring-insert find-tag-marker-ring (point-marker))
- (funcall switcher fname)
- (helm-goto-line linum t)
- (when (search-forward elm nil t)
- (goto-char (match-beginning 0))))))
-
-(defun helm-etags-mtime (file)
- "Last modification time of etags tag FILE."
- (cadr (nth 5 (file-attributes file))))
-
-(defun helm-etags-file-modified-p (file)
- "Check if tag FILE have been modified in this session.
-If FILE is nil return nil."
- (let ((last-modif (and file
- (assoc-default file helm-etags-mtime-alist))))
- (and last-modif
- (/= last-modif (helm-etags-mtime file)))))
-
-;;;###autoload
-(defun 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."
- (interactive "P")
- (let ((tag-files (helm-etags-all-tag-files))
- (helm-execute-action-at-once-if-one
- helm-etags-execute-action-at-once-if-one)
- (str (if (region-active-p)
- (buffer-substring-no-properties
- (region-beginning) (region-end))
- ;; Use a raw syntax-table to determine tap.
- ;; This may be wrong when calling etags
- ;; with hff from a buffer that use
- ;; a different syntax, but most of the time it
- ;; should be better.
- (with-syntax-table (standard-syntax-table)
- (thing-at-point 'symbol)))))
- (if (cl-notany 'file-exists-p tag-files)
- (message "Error: No tag file found.\
-Create with etags shell command, or visit with `find-tag' or `visit-tags-table'.")
- (cl-loop for k being the hash-keys of helm-etags-cache
- unless (member k tag-files)
- do (remhash k helm-etags-cache))
- (mapc (lambda (f)
- (when (or (equal reinit '(4))
- (and helm-etags-mtime-alist
- (helm-etags-file-modified-p f)))
- (remhash f helm-etags-cache)))
- tag-files)
- (unless helm-source-etags-select
- (setq helm-source-etags-select
- (helm-etags-build-source)))
- (helm :sources 'helm-source-etags-select
- :keymap helm-etags-map
- :default (if helm-etags-fuzzy-match
- str
- (list (concat "\\_<" str "\\_>") str))
- :buffer "*helm etags*"))))
-
-(provide 'helm-tags)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-tags.el ends here
+++ /dev/null
-;;; helm-types.el --- Helm types classes and methods. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.com>
-
-;; Author: Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.com>
-;; URL: http://github.com/emacs-helm/helm
-
-;; 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 'cl-lib)
-(require 'eieio)
-
-\f
-;; Files
-(defclass helm-type-file (helm-source) ()
- "A class to define helm type file.")
-
-(defmethod helm-source-get-action-from-type ((object helm-type-file))
- (slot-value object 'action))
-
-(defun helm-actions-from-type-file ()
- (let ((source (make-instance 'helm-type-file)))
- (helm--setup-source source)
- (helm-source-get-action-from-type source)))
-
-(defcustom helm-type-file-actions
- (helm-make-actions
- "Find file" 'helm-find-many-files
- "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
- "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
- "Etags `M-., C-u reload tag file'" 'helm-ff-etags-select
- "View file" 'view-file
- "Insert file" 'insert-file
- "Add marked files to file-cache" 'helm-ff-cache-add-file
- "Delete file(s)" 'helm-delete-marked-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)
- "Default actions for type files."
- :group 'helm-files
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm--setup-source :primary ((_source helm-type-file)))
-
-(defmethod helm--setup-source :before ((source helm-type-file))
- (set-slot-value source 'action 'helm-type-file-actions)
- (set-slot-value source 'persistent-help "Show this file")
- (set-slot-value source 'action-transformer '(helm-transform-file-load-el
- helm-transform-file-browse-url
- helm-transform-file-cache))
- (set-slot-value source 'candidate-transformer '(helm-skip-boring-files
- helm-highlight-files
- helm-w32-pathname-transformer))
- (set-slot-value source 'help-message 'helm-generic-file-help-message)
- (set-slot-value source 'keymap helm-generic-files-map))
-
-\f
-;; Bookmarks
-(defclass helm-type-bookmark (helm-source) ()
- "A class to define type bookmarks.")
-
-(defcustom helm-type-bookmark-actions
- (helm-make-actions
- "Jump to bookmark" 'helm-bookmark-jump
- "Jump to BM other window" 'helm-bookmark-jump-other-window
- "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)
- "Default actions for type bookmarks."
- :group 'helm-bookmark
- :type '(alist :key-type string
- :value-type function))
-
-(defmethod helm-source-get-action-from-type ((object helm-type-bookmark))
- (slot-value object 'action))
-
-(defmethod helm--setup-source :primary ((_source helm-type-bookmark)))
-
-(defmethod helm--setup-source :before ((source helm-type-bookmark))
- (set-slot-value source 'action 'helm-type-bookmark-actions)
- (set-slot-value source 'keymap helm-bookmark-map)
- (set-slot-value source 'help-message 'helm-bookmark-help-message)
- (set-slot-value source 'migemo t))
-
-\f
-;; Buffers
-(defclass helm-type-buffer (helm-source) ()
- "A class to define type buffer.")
-
-(defcustom helm-type-buffer-actions
- (helm-make-actions
- "Switch to buffer(s)" 'helm-switch-to-buffers
- (lambda () (and (locate-library "popwin")
- "Switch to buffer in popup window"))
- 'popwin:popup-buffer
- "Switch to buffer(s) other window `C-c o'"
- 'helm-switch-to-buffers-other-window
- "Switch to buffer other frame `C-c C-o'"
- 'switch-to-buffer-other-frame
- (lambda () (and (locate-library "elscreen")
- "Display buffer in Elscreen"))
- 'helm-find-buffer-on-elscreen
- "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
- "Grep buffers `M-g s' (C-u grep all buffers)"
- 'helm-zgrep-buffers
- "Multi occur buffer(s) `C-s'" 'helm-multi-occur-as-action
- "Revert buffer(s) `M-U'" '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-='"
- (lambda (candidate)
- (helm-ediff-marked-buffers candidate t)))
- "Default actions for type buffers."
- :group 'helm-buffers
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm-source-get-action-from-type ((object helm-type-buffer))
- (slot-value object 'action))
-
-(defmethod helm--setup-source :primary ((_source helm-type-buffer)))
-
-(defmethod helm--setup-source :before ((source helm-type-buffer))
- (set-slot-value source 'action 'helm-type-buffer-actions)
- (set-slot-value source 'persistent-help "Show this buffer")
- (set-slot-value
- source 'filtered-candidate-transformer
- '(helm-skip-boring-buffers
- helm-buffers-sort-transformer
- helm-highlight-buffers)))
-\f
-;; Functions
-(defclass helm-type-function (helm-source) ()
- "A class to define helm type function.")
-
-(defcustom helm-type-function-actions
- (helm-make-actions
- "Describe command" 'describe-function
- "Add command to kill ring" 'helm-kill-new
- "Go to command's definition" 'find-function
- "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)
- "Default actions for type functions."
- :group 'helm-elisp
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm-source-get-action-from-type ((object helm-type-function))
- (slot-value object 'action))
-
-(defun helm-actions-from-type-function ()
- (let ((source (make-instance 'helm-type-function)))
- (helm--setup-source source)
- (helm-source-get-action-from-type source)))
-
-(defmethod helm--setup-source :primary ((_source helm-type-function)))
-
-(defmethod helm--setup-source :before ((source helm-type-function))
- (set-slot-value source 'action 'helm-type-function-actions)
- (set-slot-value source 'action-transformer
- 'helm-transform-function-call-interactively)
- (set-slot-value source 'candidate-transformer
- 'helm-mark-interactive-functions)
- (set-slot-value source 'coerce 'helm-symbolify))
-
-\f
-;; Commands
-(defclass helm-type-command (helm-source) ()
- "A class to define helm type command.")
-
-(defun helm-actions-from-type-command ()
- (let ((source (make-instance 'helm-type-command)))
- (helm--setup-source source)
- (helm-source-get-action-from-type source)))
-
-(defcustom helm-type-command-actions
- (append (helm-make-actions
- "Call interactively" 'helm-call-interactively)
- (helm-actions-from-type-function))
- "Default actions for type command."
- :group 'helm-command
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm--setup-source :primary ((_source helm-type-command)))
-
-(defmethod helm--setup-source :before ((source helm-type-command))
- (set-slot-value
- source 'action 'helm-type-command-actions)
- (set-slot-value source 'coerce 'helm-symbolify)
- (set-slot-value source 'persistent-action 'describe-function))
-
-;; Timers
-(defclass helm-type-timers (helm-source) ()
- "A class to define helm type timers.")
-
-(defcustom helm-type-timers-actions
- '(("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 (byte-code-function-p it)
- (message "Can't find anonymous function `%s'" it)
- (find-function it))))))
- "Default actions for type timers."
- :group 'helm-elisp
- :type '(alist :key-type string :value-type function))
-
-(defmethod helm--setup-source :primary ((_source helm-type-timers)))
-
-(defmethod helm--setup-source :before ((source helm-type-timers))
- (set-slot-value source 'action 'helm-type-timers-actions)
- (set-slot-value source 'persistent-action
- (lambda (tm)
- (describe-function (timer--function tm))))
- (set-slot-value source 'persistent-help "Describe Function"))
-\f
-;; Builders.
-(defun helm-build-type-file ()
- (helm-make-type 'helm-type-file))
-
-(defun helm-build-type-function ()
- (helm-make-type 'helm-type-function))
-
-(defun helm-build-type-command ()
- (helm-make-type 'helm-type-command))
-
-(provide 'helm-types)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-types.el ends here
+++ /dev/null
-;;; helm-utils.el --- Utilities Functions for helm. -*- lexical-binding: t -*-
-
-;; Copyright (C) 2012 ~ 2015 Thierry Volpiatto <thierry.volpiattoNOSPAMgmail.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
-;; 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 'cl-lib)
-(require 'helm)
-(require 'helm-help)
-(require 'compile) ; Fixme: Is this needed?
-(require 'dired)
-
-(declare-function helm-find-files-1 "helm-files.el" (fname &optional preselect))
-(declare-function popup-tip "ext:popup")
-(defvar winner-boring-buffers)
-
-\f
-(defgroup helm-utils nil
- "Utilities routines for Helm."
- :group 'helm)
-
-(defcustom helm-su-or-sudo "sudo"
- "What command to use for root access."
- :type 'string
- :group 'helm-utils)
-
-(defcustom helm-default-kbsize 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."
- :group 'helm-utils
- :type 'float)
-
-(define-obsolete-variable-alias
- 'helm-highlight-number-lines-around-point
- 'helm-highlight-matches-around-point-max-lines
- "20160119")
-
-(defcustom helm-highlight-matches-around-point-max-lines 15
- "Number of lines around point where matched items are highlighted."
- :group 'helm-utils
- :type 'integer)
-
-(defcustom helm-buffers-to-resize-on-pa nil
- "A list of helm buffers where the helm-window should be reduced on persistent actions."
- :group 'helm-utils
- :type '(repeat (choice string)))
-
-(defcustom helm-resize-on-pa-text-height 12
- "The size of the helm-window when resizing on persistent action."
- :group 'helm-utils
- :type 'integer)
-
-(defcustom helm-sources-using-help-echo-popup '("Moccur" "Imenu in all buffers"
- "Ack-Grep" "AG" "Gid" "Git-Grep")
- "Show the buffer name or the filename in a popup at selection."
- :group 'helm-utils
- :type '(repeat (choice string)))
-
-\f
-(defvar helm-goto-line-before-hook '(helm-save-current-pos-to-mark-ring)
- "Run before jumping to line.
-This hook run when jumping from `helm-goto-line', `helm-etags-default-action',
-and `helm-imenu-default-action'.
-This allow 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 instead (or adding) `helm-save-pos-to-register-before-jump'.
-In this case last position is added to the register
-`helm-save-pos-before-jump-register'.")
-
-(defvar helm-save-pos-before-jump-register ?_
- "The register where `helm-save-pos-to-register-before-jump' save position.")
-
-\f
-;;; Faces.
-;;
-(defface helm-selection-line
- '((t (:inherit highlight :distant-foreground "black")))
- "Face used in the `helm-current-buffer' when jumping to candidate."
- :group 'helm-faces)
-
-(defface helm-match-item
- '((t (:inherit isearch)))
- "Face used to highlight item matched in a selected line."
- :group 'helm-faces)
-
-\f
-;; CUA workaround
-(defadvice cua-delete-region (around helm-avoid-cua activate)
- (ignore-errors ad-do-it))
-
-(defadvice copy-region-as-kill (around helm-avoid-cua activate)
- (if cua-mode
- (ignore-errors ad-do-it)
- ad-do-it))
-
-\f
-;;; Utils functions
-;;
-;;
-(defun helm-switch-to-buffers (buffer-or-name &optional other-window)
- "Switch to buffer BUFFER-OR-NAME.
-If more than one buffer marked switch to these buffers in separate windows.
-If OTHER-WINDOW is specified keep current-buffer and switch to others buffers
-in separate windows."
- (let* ((mkds (helm-marked-candidates))
- (size (/ (window-height) (length mkds))))
- (or (<= window-min-height size)
- (error "Too many buffers to visit simultaneously."))
- (helm-aif (cdr mkds)
- (progn
- (if other-window
- (switch-to-buffer-other-window (car mkds))
- (switch-to-buffer (car mkds)))
- (save-selected-window
- (cl-loop for b in it
- do (progn
- (select-window (split-window))
- (switch-to-buffer b)))))
- (if other-window
- (switch-to-buffer-other-window buffer-or-name)
- (switch-to-buffer buffer-or-name)))))
-
-(defun helm-switch-to-buffers-other-window (buffer-or-name)
- "switch to buffer BUFFER-OR-NAME in other window.
-See `helm-switch-to-buffers' for switching to marked buffers."
- (helm-switch-to-buffers buffer-or-name t))
-
-(cl-defun helm-current-buffer-narrowed-p (&optional
- (buffer helm-current-buffer))
- "Check if BUFFER is narrowed.
-Default is `helm-current-buffer'."
- (with-current-buffer buffer
- (let ((beg (point-min))
- (end (point-max))
- (total (buffer-size)))
- (or (/= beg 1) (/= end (1+ total))))))
-
-(defun helm-goto-char (loc)
- "Go to char, revealing if necessary."
- (goto-char loc)
- (when (or (eq major-mode 'org-mode)
- (and (boundp 'outline-minor-mode)
- outline-minor-mode))
- (require 'org) ; On some old Emacs versions org may not be loaded.
- (org-reveal)))
-
-(defun helm-goto-line (lineno &optional noanim)
- "Goto LINENO opening only outline headline if needed.
-Animation is used unless NOANIM is non--nil."
- (helm-log-run-hook 'helm-goto-line-before-hook)
- (goto-char (point-min))
- (helm-goto-char (point-at-bol lineno))
- (unless noanim
- (helm-highlight-current-line nil nil nil nil 'pulse)))
-
-(defun helm-save-pos-to-register-before-jump ()
- "Save current buffer position to `helm-save-pos-before-jump-register'.
-To use this add it to `helm-goto-line-before-hook'."
- (with-helm-current-buffer
- (unless helm-in-persistent-action
- (point-to-register helm-save-pos-before-jump-register))))
-
-(defun helm-save-current-pos-to-mark-ring ()
- "Save current buffer position to mark ring.
-To use this add it to `helm-goto-line-before-hook'."
- (with-helm-current-buffer
- (unless helm-in-persistent-action
- (set-marker (mark-marker) (point))
- (push-mark (point) 'nomsg))))
-
-(defun helm-show-all-in-this-source-only (arg)
- "Show only current source of this helm session with all its candidates.
-With a numeric prefix arg show only the ARG number of candidates."
- (interactive "p")
- (with-helm-alive-p
- (with-helm-window
- (with-helm-default-directory (helm-default-directory)
- (let ((helm-candidate-number-limit (and (> arg 1) arg)))
- (helm-set-source-filter
- (list (assoc-default 'name (helm-get-current-source)))))))))
-(put 'helm-show-all-in-this-source-only 'helm-only t)
-
-(defun helm-display-all-sources ()
- "Display all sources previously hidden by `helm-set-source-filter'."
- (interactive)
- (with-helm-alive-p
- (helm-set-source-filter nil)))
-(put 'helm-display-all-sources 'helm-only t)
-
-(defun helm-displaying-source-names ()
- "Return the list of sources name for this helm session."
- (with-current-buffer helm-buffer
- (goto-char (point-min))
- (cl-loop with pos
- while (setq pos (next-single-property-change (point) 'helm-header))
- do (goto-char pos)
- collect (buffer-substring-no-properties (point-at-bol)(point-at-eol))
- do (forward-line 1))))
-
-(defun helm-handle-winner-boring-buffers ()
- "Add `helm-buffer' to `winner-boring-buffers' when quitting/exiting helm.
-Add this function to `helm-cleanup-hook' when you don't want to see helm buffers
-after running winner-undo/redo."
- (require 'winner)
- (cl-pushnew helm-buffer winner-boring-buffers :test 'equal))
-(add-hook 'helm-cleanup-hook #'helm-handle-winner-boring-buffers)
-
-(defun 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."
- (interactive)
- (with-helm-alive-p
- (require 'helm-grep)
- (helm-run-after-exit
- (lambda (f)
- (if (file-exists-p f)
- (helm-find-files-1 (file-name-directory f)
- (concat
- "^"
- (regexp-quote
- (if helm-ff-transformer-show-only-basename
- (helm-basename f) f))))
- (helm-find-files-1 f)))
- (let* ((sel (helm-get-selection))
- (grep-line (and (stringp sel)
- (helm-grep-split-line sel)))
- (bmk-name (and (stringp sel)
- (not grep-line)
- (replace-regexp-in-string "\\`\\*" "" sel)))
- (bmk (and bmk-name (assoc bmk-name bookmark-alist)))
- (buf (helm-aif (and (bufferp sel) (get-buffer sel))
- (buffer-name it)))
- (default-preselection (or (buffer-file-name helm-current-buffer)
- default-directory)))
- (cond
- ;; Buffer.
- (buf (or (buffer-file-name sel)
- (car (rassoc buf dired-buffers))
- (and (with-current-buffer buf
- (eq major-mode 'org-agenda-mode))
- org-directory
- (expand-file-name org-directory))
- (with-current-buffer buf default-directory)))
- ;; Bookmark.
- (bmk (helm-aif (bookmark-get-filename bmk)
- (if (and ffap-url-regexp
- (string-match ffap-url-regexp it))
- it (expand-file-name it))
- default-directory))
- ((or (file-remote-p sel)
- (file-exists-p sel))
- (expand-file-name sel))
- ;; Grep.
- ((and grep-line (file-exists-p (car grep-line)))
- (expand-file-name (car grep-line)))
- ;; Occur.
- (grep-line
- (with-current-buffer (get-buffer (car grep-line))
- (or (buffer-file-name) default-directory)))
- ;; Url.
- ((and ffap-url-regexp (string-match ffap-url-regexp sel)) sel)
- ;; Default.
- (t default-preselection))))))
-(put 'helm-quit-and-find-file 'helm-only t)
-
-(defun helm-generic-sort-fn (s1 s2)
- "Sort predicate function for helm candidates.
-Args S1 and S2 can be single or \(display . real\) candidates,
-that is sorting is done against real value of candidate."
- (let* ((pattern (regexp-quote helm-pattern))
- (reg1 (concat "\\_<" pattern "\\_>"))
- (reg2 (concat "\\_<" pattern))
- (reg3 helm-pattern)
- (split (split-string pattern))
- (str1 (if (consp s1) (cdr s1) s1))
- (str2 (if (consp s2) (cdr s2) s2))
- (score (lambda (str r1 r2 r3 lst)
- (+ (if (string-match (concat "\\`" pattern) str) 1 0)
- (cond ((string-match r1 str) 5)
- ((and (string-match " " pattern)
- (string-match (concat "\\_<" (car lst)) str)
- (cl-loop for r in (cdr lst)
- always (string-match r str))) 4)
- ((and (string-match " " pattern)
- (cl-loop for r in lst always (string-match r str))) 3)
- ((string-match r2 str) 2)
- ((string-match r3 str) 1)
- (t 0)))))
- (sc1 (funcall score str1 reg1 reg2 reg3 split))
- (sc2 (funcall score str2 reg1 reg2 reg3 split)))
- (cond ((or (zerop (string-width pattern))
- (and (zerop sc1) (zerop sc2)))
- (string-lessp str1 str2))
- ((= sc1 sc2)
- (< (length str1) (length str2)))
- (t (> sc1 sc2)))))
-
-(defun helm-ff-get-host-from-tramp-invalid-fname (fname)
- "Extract hostname from an incomplete tramp file name.
-Return nil on valid file name remote or not."
- (let* ((str (helm-basename fname))
- (split (split-string str ":"))
- (meth (car (member (car split) (mapcar 'car tramp-methods)))))
- (when (and meth (<= (length split) 2))
- (cadr split))))
-
-(cl-defun helm-file-human-size (size &optional (kbsize helm-default-kbsize))
- "Return a string showing SIZE of a file in human readable form.
-SIZE can be an integer or a float depending it's value.
-`file-attributes' will take care of that to avoid overflow error.
-KBSIZE if a floating point number, defaulting to `helm-default-kbsize'."
- (let ((M (cons "M" (/ size (expt kbsize 2))))
- (G (cons "G" (/ size (expt kbsize 3))))
- (K (cons "K" (/ size kbsize)))
- (B (cons "B" size)))
- (cl-loop with result = B
- for (a . b) in
- (cl-loop for (x . y) in (list M G K B)
- unless (< y 1) collect (cons x y))
- when (< b (cdr result)) do (setq result (cons a b))
- finally return (if (string= (car result) "B")
- (format "%s" size)
- (format "%.1f%s" (cdr result) (car result))))))
-
-(cl-defun helm-file-attributes
- (file &key type links uid gid access-time modif-time
- status size mode gid-change inode device-num dired human-size
- mode-type mode-owner mode-group mode-other (string t))
- "Return `file-attributes' elements of FILE separately according to key value.
-Availables keys are:
-- TYPE: Same as nth 0 `files-attributes' if STRING is nil
- otherwise return either symlink, directory or file (default).
-- LINKS: See nth 1 `files-attributes'.
-- UID: See nth 2 `files-attributes'.
-- GID: See nth 3 `files-attributes'.
-- ACCESS-TIME: See nth 4 `files-attributes', however format time
- when STRING is non--nil (the default).
-- MODIF-TIME: See nth 5 `files-attributes', same as above.
-- STATUS: See nth 6 `files-attributes', same as above.
-- SIZE: See nth 7 `files-attributes'.
-- MODE: See nth 8 `files-attributes'.
-- GID-CHANGE: See nth 9 `files-attributes'.
-- INODE: See nth 10 `files-attributes'.
-- DEVICE-NUM: See nth 11 `files-attributes'.
-- DIRED: A line similar to what 'ls -l' return.
-- HUMAN-SIZE: The size in human form, see `helm-file-human-size'.
-- MODE-TYPE, mode-owner,mode-group, mode-other: Split what
- nth 7 `files-attributes' return in four categories.
-- STRING: When non--nil (default) `helm-file-attributes' return
- more friendly values.
-If you want the same behavior as `files-attributes' ,
-\(but with return values in proplist\) use a nil value for STRING.
-However when STRING is non--nil, time and type value are different from what
-you have in `file-attributes'."
- (let* ((all (cl-destructuring-bind
- (type links uid gid access-time modif-time
- status size mode gid-change inode device-num)
- (file-attributes file string)
- (list :type (if string
- (cond ((stringp type) "symlink") ; fname
- (type "directory") ; t
- (t "file")) ; nil
- type)
- :links links
- :uid uid
- :gid gid
- :access-time (if string
- (format-time-string
- "%Y-%m-%d %R" access-time)
- access-time)
- :modif-time (if string
- (format-time-string
- "%Y-%m-%d %R" modif-time)
- modif-time)
- :status (if string
- (format-time-string
- "%Y-%m-%d %R" status)
- status)
- :size size
- :mode mode
- :gid-change gid-change
- :inode inode
- :device-num device-num)))
- (modes (helm-split-mode-file-attributes (cl-getf all :mode))))
- (cond (type (cl-getf all :type))
- (links (cl-getf all :links))
- (uid (cl-getf all :uid))
- (gid (cl-getf all :gid))
- (access-time (cl-getf all :access-time))
- (modif-time (cl-getf all :modif-time))
- (status (cl-getf all :status))
- (size (cl-getf all :size))
- (mode (cl-getf all :mode))
- (gid-change (cl-getf all :gid-change))
- (inode (cl-getf all :inode))
- (device-num (cl-getf all :device-num))
- (dired
- (concat
- (helm-split-mode-file-attributes (cl-getf all :mode) t) " "
- (number-to-string (cl-getf all :links)) " "
- (cl-getf all :uid) ":"
- (cl-getf all :gid) " "
- (if human-size
- (helm-file-human-size (cl-getf all :size))
- (int-to-string (cl-getf all :size))) " "
- (cl-getf all :modif-time)))
- (human-size (helm-file-human-size (cl-getf all :size)))
- (mode-type (cl-getf modes :mode-type))
- (mode-owner (cl-getf modes :user))
- (mode-group (cl-getf modes :group))
- (mode-other (cl-getf modes :other))
- (t (append all modes)))))
-
-(defun helm-split-mode-file-attributes (str &optional string)
- "Split mode file attributes STR into a proplist.
-If STRING is non--nil return instead a space separated string."
- (cl-loop with type = (substring str 0 1)
- with cdr = (substring str 1)
- for i across cdr
- for count from 1
- if (<= count 3)
- concat (string i) into user
- if (and (> count 3) (<= count 6))
- concat (string i) into group
- if (and (> count 6) (<= count 9))
- concat (string i) into other
- finally return
- (if string
- (mapconcat 'identity (list type user group other) " ")
- (list :mode-type type :user user :group group :other other))))
-
-(defmacro with-helm-display-marked-candidates (buffer-or-name candidates &rest body)
- (declare (indent 0) (debug t))
- (helm-with-gensyms (buffer window)
- `(let* ((,buffer (temp-buffer-window-setup ,buffer-or-name))
- ,window)
- (unwind-protect
- (with-current-buffer ,buffer
- (dired-format-columns-of-files ,candidates)
- (select-window
- (setq ,window (temp-buffer-window-show
- ,buffer
- '(display-buffer-below-selected
- (window-height . fit-window-to-buffer)))))
- (progn ,@body))
- (quit-window 'kill ,window)))))
-
-;;; Persistent Action Helpers
-;;
-;;
-;; Internal
-(defvar helm-match-line-overlay nil)
-(defvar helm--match-item-overlays nil)
-
-(defun helm-highlight-current-line (&optional start end buf face pulse)
- "Highlight and underline current position"
- (let* ((start (or start (line-beginning-position)))
- (end (or end (1+ (line-end-position))))
- (start-match (if (or (null helm-highlight-matches-around-point-max-lines)
- (zerop helm-highlight-matches-around-point-max-lines))
- start
- (save-excursion
- (forward-line
- (- helm-highlight-matches-around-point-max-lines))
- (point-at-bol))))
- (end-match (if (or (null helm-highlight-matches-around-point-max-lines)
- (zerop helm-highlight-matches-around-point-max-lines))
- end
- (save-excursion
- (forward-line
- helm-highlight-matches-around-point-max-lines)
- (point-at-eol))))
- (args (list start end buf)))
- (if (not helm-match-line-overlay)
- (setq helm-match-line-overlay (apply 'make-overlay args))
- (apply 'move-overlay helm-match-line-overlay args))
- (overlay-put helm-match-line-overlay
- 'face (or face 'helm-selection-line))
- (catch 'empty-line
- (cl-loop with ov
- for r in (helm-remove-if-match
- "\\`!" (split-string helm-input))
- do (save-excursion
- (goto-char start-match)
- (while (condition-case _err
- (if helm-migemo-mode
- (helm-mm-migemo-forward r end-match t)
- (re-search-forward r end-match t))
- (invalid-regexp nil))
- (let ((s (match-beginning 0))
- (e (match-end 0)))
- (if (= s e)
- (throw 'empty-line nil)
- (push (setq ov (make-overlay s e))
- helm--match-item-overlays)
- (overlay-put ov 'face 'helm-match-item)
- (overlay-put ov 'priority 1)))))))
- (recenter)
- (when pulse
- (sit-for 0.3)
- (helm-match-line-cleanup))))
-
-(defun helm-match-line-cleanup ()
- (when helm-match-line-overlay
- (delete-overlay helm-match-line-overlay)
- (setq helm-match-line-overlay nil))
- (when helm--match-item-overlays
- (mapc 'delete-overlay helm--match-item-overlays)))
-
-(defun helm-match-line-update ()
- (when helm-match-line-overlay
- (delete-overlay helm-match-line-overlay)
- (helm-highlight-current-line)))
-
-(defun helm-persistent-autoresize-hook ()
- (when (and helm-buffers-to-resize-on-pa
- (member helm-buffer helm-buffers-to-resize-on-pa)
- (eq helm-split-window-state 'vertical))
- (set-window-text-height (helm-window) helm-resize-on-pa-text-height)))
-
-(add-hook 'helm-after-persistent-action-hook 'helm-persistent-autoresize-hook)
-(add-hook 'helm-cleanup-hook 'helm-match-line-cleanup)
-(add-hook 'helm-after-persistent-action-hook 'helm-match-line-update)
-
-;;; Popup buffer-name or filename in grep/moccur/imenu-all.
-;;
-(defvar helm--show-help-echo-timer nil)
-
-(defun helm-cancel-help-echo-timer ()
- (when helm--show-help-echo-timer
- (cancel-timer helm--show-help-echo-timer)
- (setq helm--show-help-echo-timer nil)))
-
-(defun helm-show-help-echo ()
- (when helm--show-help-echo-timer
- (cancel-timer helm--show-help-echo-timer)
- (setq helm--show-help-echo-timer nil))
- (when (and helm-alive-p
- (member (assoc-default 'name (helm-get-current-source))
- helm-sources-using-help-echo-popup))
- (setq helm--show-help-echo-timer
- (run-with-idle-timer
- 1 nil
- (lambda ()
- (with-helm-window
- (helm-aif (get-text-property (point-at-bol) 'help-echo)
- (popup-tip (concat " " (abbreviate-file-name it))
- :around nil
- :point (save-excursion
- (end-of-visual-line) (point))))))))))
-
-;;;###autoload
-(define-minor-mode helm-popup-tip-mode
- "Show help-echo informations in a popup tip at end of line."
- :global t
- (require 'popup)
- (if helm-popup-tip-mode
- (progn
- (add-hook 'helm-update-hook 'helm-show-help-echo) ; Needed for async sources.
- (add-hook 'helm-move-selection-after-hook 'helm-show-help-echo)
- (add-hook 'helm-cleanup-hook 'helm-cancel-help-echo-timer))
- (remove-hook 'helm-update-hook 'helm-show-help-echo)
- (remove-hook 'helm-move-selection-after-hook 'helm-show-help-echo)
- (remove-hook 'helm-cleanup-hook 'helm-cancel-help-echo-timer)))
-
-(defun helm-open-file-with-default-tool (file)
- "Open FILE with the default tool on this platform."
- (let (process-connection-type)
- (if (eq system-type 'windows-nt)
- (helm-w32-shell-execute-open-file file)
- (start-process "helm-open-file-with-default-tool"
- nil
- (cond ((eq system-type 'gnu/linux)
- "xdg-open")
- ((or (eq system-type 'darwin) ;; Mac OS X
- (eq system-type 'macos)) ;; Mac OS 9
- "open"))
- file))))
-
-(defun helm-open-dired (file)
- "Opens a dired buffer in FILE's directory. If FILE is a
-directory, open this directory."
- (if (file-directory-p file)
- (dired file)
- (dired (file-name-directory file))
- (dired-goto-file file)))
-
-(defun helm-require-or-error (feature function)
- (or (require feature nil t)
- (error "Need %s to use `%s'." feature function)))
-
-(defun helm-find-file-as-root (candidate)
- (let* ((buf (helm-basename candidate))
- (host (file-remote-p candidate 'host))
- (remote-path (format "/%s:%s:%s"
- helm-su-or-sudo
- (or host "")
- (expand-file-name
- (if host
- (file-remote-p candidate 'localname)
- candidate))))
- non-essential)
- (if (buffer-live-p (get-buffer buf))
- (progn
- (set-buffer buf)
- (find-alternate-file remote-path))
- (find-file remote-path))))
-
-(defun helm-find-many-files (_ignore)
- (let ((helm--reading-passwd-or-string t))
- (mapc 'find-file (helm-marked-candidates))))
-
-(defun helm-read-repeat-string (prompt &optional count)
- "Prompt as many time PROMPT is not empty.
-If COUNT is non--nil add a number after each prompt."
- (cl-loop with elm
- while (not (string= elm ""))
- for n from 1
- do (when count
- (setq prompt (concat prompt (int-to-string n) ": ")))
- collect (setq elm (helm-read-string prompt)) into lis
- finally return (remove "" lis)))
-
-(defun helm-html-bookmarks-to-alist (file url-regexp bmk-regexp)
- "Parse html bookmark FILE and return an alist with (title . url) as elements."
- (let (bookmarks-alist url title)
- (with-temp-buffer
- (insert-file-contents file)
- (goto-char (point-min))
- (while (re-search-forward "href=\\|^ *<DT><A HREF=" nil t)
- (forward-line 0)
- (when (re-search-forward url-regexp nil t)
- (setq url (match-string 0)))
- (when (re-search-forward bmk-regexp nil t)
- (setq title (match-string 1)))
- (push (cons title url) bookmarks-alist)
- (forward-line)))
- (nreverse bookmarks-alist)))
-
-
-(provide 'helm-utils)
-
-;; Local Variables:
-;; byte-compile-warnings: (not cl-functions obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
-;;; helm-utils.el ends here
+++ /dev/null
-;;; helm-swoop-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-(add-to-list 'load-path (or (file-name-directory #$) (car load-path)))
-\f
-;;;### (autoloads nil "helm-swoop" "helm-swoop.el" (22215 7848 0
-;;;;;; 0))
-;;; Generated autoloads from helm-swoop.el
-
-(autoload 'helm-swoop-back-to-last-point "helm-swoop" "\
-Go back to last position where `helm-swoop' was called
-
-\(fn &optional $CANCEL)" t nil)
-
-(autoload 'helm-swoop "helm-swoop" "\
-List the all lines to another buffer, which is able to squeeze by
- any words you input. At the same time, the original buffer's cursor
- is jumping line to line according to moving up and down the list.
-
-\(fn &key $QUERY $SOURCE ($multiline current-prefix-arg))" t nil)
-
-(autoload 'helm-swoop-from-isearch "helm-swoop" "\
-Invoke `helm-swoop' from isearch.
-
-\(fn)" t nil)
-
-(autoload 'helm-multi-swoop "helm-swoop" "\
-Usage:
-M-x helm-multi-swoop
-1. Select any buffers by [C-SPC] or [M-SPC]
-2. Press [RET] to start helm-multi-swoop
-
-C-u M-x helm-multi-swoop
-If you have done helm-multi-swoop before, you can skip select buffers step.
-Last selected buffers will be applied to helm-multi-swoop.
-
-\(fn &optional $QUERY $BUFLIST)" t nil)
-
-(autoload 'helm-multi-swoop-all "helm-swoop" "\
-Apply all buffers to helm-multi-swoop
-
-\(fn &optional $QUERY)" t nil)
-
-(autoload 'helm-multi-swoop-org "helm-swoop" "\
-Applies all org-mode buffers to helm-multi-swoop
-
-\(fn &optional $QUERY)" t nil)
-
-(autoload 'helm-multi-swoop-current-mode "helm-swoop" "\
-Applies all buffers of the same mode as the current buffer to helm-multi-swoop
-
-\(fn &optional $QUERY)" t nil)
-
-(autoload 'helm-swoop-without-pre-input "helm-swoop" "\
-Start helm-swoop without pre input query.
-
-\(fn)" t nil)
-
-(autoload 'helm-swoop-symble-pre-input "helm-swoop" "\
-Start helm-swoop without pre input query.
-
-\(fn)" t nil)
-
-(autoload 'helm-multi-swoop-edit "helm-swoop" "\
-
-
-\(fn)" t nil)
-
-;;;***
-\f
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; End:
-;;; helm-swoop-autoloads.el ends here
+++ /dev/null
-(define-package "helm-swoop" "20160131.533" "Efficiently hopping squeezed lines powered by helm interface" '((helm "1.0") (emacs "24")) :url "https://github.com/ShingoFukuyama/helm-swoop" :keywords '("helm" "swoop" "inner" "buffer" "search"))
+++ /dev/null
-;;; helm-swoop.el --- Efficiently hopping squeezed lines powered by helm interface -*- coding: utf-8; lexical-binding: t -*-
-
-;; Copyright (C) 2013 by Shingo Fukuyama
-
-;; Version: 1.7.1
-;; Package-Version: 20160131.533
-;; Author: Shingo Fukuyama - http://fukuyama.co
-;; URL: https://github.com/ShingoFukuyama/helm-swoop
-;; Created: Oct 24 2013
-;; Keywords: helm swoop inner buffer search
-;; Package-Requires: ((helm "1.0") (emacs "24"))
-
-;; 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 2 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.
-
-;;; Commentary:
-
-;; List the all lines to another buffer, which is able to squeeze
-;; by any words you input. At the same time, the original buffer's
-;; cursor is jumping line to line according to moving up and down
-;; the list.
-
-;; Example config
-;; ----------------------------------------------------------------
-;; ;; helm from https://github.com/emacs-helm/helm
-;; (require 'helm)
-
-;; ;; Locate the helm-swoop folder to your path
-;; ;; This line is unnecessary if you get this program from MELPA
-;; (add-to-list 'load-path "~/.emacs.d/elisp/helm-swoop")
-
-;; (require 'helm-swoop)
-
-;; ;; Change keybinds to whatever you like :)
-;; (global-set-key (kbd "M-i") 'helm-swoop)
-;; (global-set-key (kbd "M-I") 'helm-swoop-back-to-last-point)
-;; (global-set-key (kbd "C-c M-i") 'helm-multi-swoop)
-;; (global-set-key (kbd "C-x M-i") 'helm-multi-swoop-all)
-
-;; ;; When doing isearch, hand the word over to helm-swoop
-;; (define-key isearch-mode-map (kbd "M-i") 'helm-swoop-from-isearch)
-;; (define-key helm-swoop-map (kbd "M-i") 'helm-multi-swoop-all-from-helm-swoop)
-
-;; ;; Save buffer when helm-multi-swoop-edit complete
-;; (setq helm-multi-swoop-edit-save t)
-
-;; ;; If this value is t, split window inside the current window
-;; (setq helm-swoop-split-with-multiple-windows nil)
-
-;; ;; Split direction. 'split-window-vertically or 'split-window-horizontally
-;; (setq helm-swoop-split-direction 'split-window-vertically)
-
-;; ;; If nil, you can slightly boost invoke speed in exchange for text color
-;; (setq helm-swoop-speed-or-color nil)
-
-;; ;; Go to the opposite side of line from the end or beginning of line
-;; (setq helm-swoop-move-to-line-cycle t)
-
-;; ;; Optional face for line numbers
-;; ;; Face name is `helm-swoop-line-number-face`
-;; (setq helm-swoop-use-line-number-face t)
-
-;; ----------------------------------------------------------------
-
-;; * `M-x helm-swoop` when region active
-;; * `M-x helm-swoop` when the cursor is at any symbol
-;; * `M-x helm-swoop` when the cursor is not at any symbol
-;; * `M-3 M-x helm-swoop` or `C-u 5 M-x helm-swoop` multi separated line culling
-;; * `M-x helm-multi-swoop` multi-occur like feature
-;; * `M-x helm-multi-swoop-all` apply all buffers
-;; * `C-u M-x helm-multi-swoop` apply last selected buffers from the second time
-;; * `M-x helm-swoop-same-face-at-point` list lines have the same face at the cursor is on
-;; * During isearch `M-i` to hand the word over to helm-swoop
-;; * During helm-swoop `M-i` to hand the word over to helm-multi-swoop-all
-;; * While doing `helm-swoop` press `C-c C-e` to edit mode, apply changes to original buffer by `C-x C-s`
-
-;; Helm Swoop Edit
-;; While doing helm-swoop, press keybind [C-c C-e] to move to edit buffer.
-;; Edit the list and apply by [C-x C-s]. If you'd like to cancel, [C-c C-g]
-
-;;; Code:
-
-(require 'cl-lib)
-(require 'helm)
-(require 'helm-utils)
-(require 'helm-grep)
-
-(declare-function migemo-search-pattern-get "migemo")
-
-;;; @ helm-swoop ----------------------------------------------
-
-(defgroup helm-swoop nil
- "Open helm-swoop."
- :prefix "helm-swoop-" :group 'helm)
-
-(defface helm-swoop-target-line-face
- '((t (:background "#e3e300" :foreground "#222222")))
- "Face for helm-swoop target line"
- :group 'helm-swoop)
-(defface helm-swoop-target-line-block-face
- '((t (:background "#cccc00" :foreground "#222222")))
- "Face for target line"
- :group 'helm-swoop)
-(defface helm-swoop-target-word-face
- '((t (:background "#7700ff" :foreground "#ffffff")))
- "Face for target word"
- :group 'helm-swoop)
-(defface helm-swoop-line-number-face
- '((t (:foreground "#999999")))
- "Face for line numbers"
- :group 'helm-swoop)
-
-(defcustom helm-swoop-speed-or-color nil
- "If nil, you can slightly boost invoke speed in exchange for text color"
- :group 'helm-swoop :type 'boolean)
-(defcustom helm-swoop-use-line-number-face nil
- "Use face to line numbers on helm-swoop buffer"
- :group 'helm-swoop :type 'boolean)
-(defcustom helm-swoop-split-with-multiple-windows nil
- "Split window when having multiple windows open"
- :group 'helm-swoop :type 'boolean)
-(defcustom helm-swoop-move-to-line-cycle t
- "Return to the opposite side of line"
- :group 'helm-swoop :type 'boolean)
-(defcustom helm-swoop-split-direction 'split-window-vertically
- "Split direction"
- :type '(choice (const :tag "vertically" split-window-vertically)
- (const :tag "horizontally" split-window-horizontally))
- :group 'helm-swoop)
-(defcustom helm-swoop-use-fuzzy-match nil
- "If t, use fuzzy matching functions as well as exact matches."
- :group 'helm-swoop :type 'boolean)
-
-(defvar helm-swoop-split-window-function
- (lambda ($buf)
- (if helm-swoop-split-with-multiple-windows
- (funcall helm-swoop-split-direction)
- (when (one-window-p)
- (funcall helm-swoop-split-direction)))
- (other-window 1)
- (switch-to-buffer $buf))
- "Change the way to split window only when `helm-swoop' is calling")
-
-(defvar helm-swoop-candidate-number-limit 19999)
-(defvar helm-swoop-buffer "*Helm Swoop*")
-(defvar helm-swoop-prompt "Swoop: ")
-(defvar helm-swoop-last-point nil)
-(defvar helm-swoop-invisible-targets nil)
-(defvar helm-swoop-last-line-info nil)
-
-;; Buffer local variables
-(defvar helm-swoop-list-cache)
-(defvar helm-swoop-pattern) ; Keep helm-pattern value
-(defvar helm-swoop-last-query) ; Last search query for resume
-(defvar helm-swoop-last-prefix-number) ; For multiline highlight
-
-;; Global variables
-(defvar helm-swoop-synchronizing-window nil
- "Window object where `helm-swoop' called from")
-(defvar helm-swoop-target-buffer nil
- "Buffer object where `helm-swoop' called from")
-(defvar helm-swoop-line-overlay nil
- "Overlay object to indicate other window's line")
-
-(defvar helm-swoop-map
- (let (($map (make-sparse-keymap)))
- (set-keymap-parent $map helm-map)
- (define-key $map (kbd "C-c C-e") 'helm-swoop-edit)
- (define-key $map (kbd "M-i") 'helm-multi-swoop-all-from-helm-swoop)
- (define-key $map (kbd "C-w") 'helm-swoop-yank-thing-at-point)
- (define-key $map (kbd "^") 'helm-swoop-caret-match)
- (delq nil $map))
- "Keymap for helm-swoop")
-
-(defvar helm-multi-swoop-map
- (let (($map (make-sparse-keymap)))
- (set-keymap-parent $map helm-map)
- (define-key $map (kbd "C-c C-e") 'helm-multi-swoop-edit)
- (delq nil $map)))
-
-(defvar helm-c-source-swoop-match-functions
- '(helm-mm-exact-match
- helm-mm-match
- helm-mm-3-migemo-match))
-
-(defvar helm-c-source-swoop-search-functions
- '(helm-mm-exact-search
- helm-mm-search
- helm-candidates-in-buffer-search-default-fn
- helm-mm-3-migemo-search))
-
-(defun helm-swoop-match-functions ()
- (if helm-swoop-use-fuzzy-match
- (append helm-c-source-swoop-match-functions '(helm-fuzzy-match))
- helm-c-source-swoop-match-functions))
-
-(defun helm-swoop-search-functions ()
- (if helm-swoop-use-fuzzy-match
- (append helm-c-source-swoop-search-functions '(helm-fuzzy-search))
- helm-c-source-swoop-search-functions))
-
-(defcustom helm-swoop-pre-input-function
- (lambda () (thing-at-point 'symbol))
- "This function can pre-input keywords when helm-swoop invoked"
- :group 'helm-swoop :type 'function)
-
-(defun helm-swoop-pre-input-optimize ($query)
- (when $query
- (let (($regexp (list '("\+" . "\\\\+")
- '("\*" . "\\\\*")
- '("\#" . "\\\\#"))))
- (mapc (lambda ($r)
- (setq $query (replace-regexp-in-string (car $r) (cdr $r) $query)))
- $regexp)
- $query)))
-
-(defsubst helm-swoop--goto-line ($line)
- (goto-char (point-min))
- (forward-line (1- $line)))
-
-(defsubst helm-swoop--recenter ()
- (recenter (/ (window-height) 2)))
-
-(defsubst helm-swoop--key-of-function ($function &optional $mode-map)
- (edmacro-format-keys (car (where-is-internal $function $mode-map))))
-
-(defsubst helm-swoop--delete-overlay ($identity &optional $beg $end)
- (or $beg (setq $beg (point-min)))
- (or $end (setq $end (point-max)))
- (overlay-recenter $end)
- (mapc (lambda ($o)
- (if (overlay-get $o $identity)
- (delete-overlay $o)))
- (overlays-in $beg $end)))
-
-(defsubst helm-swoop--get-string-at-line ()
- (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
-
-(defsubst helm-swoop--buffer-substring ($point-min $point-max)
- (if helm-swoop-speed-or-color
- (let (($content (buffer-substring $point-min $point-max)))
- (with-temp-buffer
- (let ((inhibit-read-only t))
- (insert $content)
- (remove-text-properties (point-min) (point-max) '(read-only t))
- (setq $content (buffer-substring (point-min) (point-max)))))
- $content)
- (buffer-substring-no-properties $point-min $point-max)))
-
-;;;###autoload
-(defun helm-swoop-back-to-last-point (&optional $cancel)
- "Go back to last position where `helm-swoop' was called"
- (interactive)
- (if helm-swoop-last-point
- (let (($po (point)))
- (switch-to-buffer (cdr helm-swoop-last-point))
- (goto-char (car helm-swoop-last-point))
- (unless $cancel
- (setq helm-swoop-last-point
- (cons $po (buffer-name (current-buffer))))))))
-
-(defun helm-swoop--split-lines-by ($string $regexp $step)
- "split-string by $step for multiline"
- (or $step (setq $step 1))
- (let (($from1 0) ;; last match point
- ($from2 0) ;; last substring point
- $list
- ($i 1)) ;; from line 1
- (while (string-match $regexp $string $from1)
- (setq $i (1+ $i))
- (if (eq 0 (% $i $step))
- (progn
- (setq $list (cons (substring $string $from2 (match-beginning 0))
- $list))
- (setq $from2 (match-end 0))
- (setq $from1 (match-end 0)))
- (setq $from1 (match-end 0))))
- (setq $list (cons (substring $string $from2) $list))
- (nreverse $list)))
-
-(defun helm-swoop--target-line-overlay-move (&optional $buf)
- "Add color to the target line"
- (move-overlay
- helm-swoop-line-overlay
- (progn
- (search-backward
- "\n" nil t (% (line-number-at-pos) helm-swoop-last-prefix-number))
- (goto-char (point-at-bol)))
- ;; For multiline highlight
- (save-excursion
- (goto-char (point-at-bol))
- (or (re-search-forward "\n" nil t helm-swoop-last-prefix-number)
- ;; For the end of buffer error
- (point-max)))
- $buf)
- (helm-swoop--unveil-invisible-overlay))
-
-(defun helm-swoop--validate-regexp (regexp)
- (condition-case nil
- (progn
- (string-match-p regexp "")
- t)
- (invalid-regexp nil)))
-
-(defun helm-swoop--target-word-overlay ($identity &optional $threshold)
- (interactive)
- (or $threshold (setq $threshold 2))
- (save-excursion
- (let (($pat (split-string helm-pattern " "))
- $o)
- (mapc (lambda ($wd)
- (when (and (helm-swoop--validate-regexp $wd) (< $threshold (length $wd)))
- (goto-char (point-min))
- ;; Optional require migemo.el
- (if (and (featurep 'migemo) helm-migemo-mode)
- (setq $wd (migemo-search-pattern-get $wd)))
- ;; For caret begging match
- (if (string-match "^\\^\\[0\\-9\\]\\+\\.\\(.+\\)" $wd)
- (setq $wd (concat "^" (match-string 1 $wd))))
- (overlay-recenter (point-max))
- (let (finish)
- (while (and (not finish) (re-search-forward $wd nil t))
- (if (= (match-beginning 0) (match-end 0))
- (forward-char 1)
- (setq $o (make-overlay (match-beginning 0) (match-end 0)))
- (overlay-put $o 'face 'helm-swoop-target-word-face)
- (overlay-put $o $identity t))
- (when (eobp)
- (setq finish t))))))
- $pat))))
-
-(defun helm-swoop--restore-unveiled-overlay ()
- (when helm-swoop-invisible-targets
- (mapc (lambda ($ov) (overlay-put (car $ov) 'invisible (cdr $ov)))
- helm-swoop-invisible-targets)
- (setq helm-swoop-invisible-targets nil)))
-
-(defun helm-swoop--unveil-invisible-overlay ()
- "Show hidden text temporarily to view it during helm-swoop.
-This function needs to call after latest helm-swoop-line-overlay set."
- (helm-swoop--restore-unveiled-overlay)
- (mapc (lambda ($ov)
- (let (($type (overlay-get $ov 'invisible)))
- (when $type
- (overlay-put $ov 'invisible nil)
- (setq helm-swoop-invisible-targets
- (cons (cons $ov $type) helm-swoop-invisible-targets)))))
- (overlays-in (overlay-start helm-swoop-line-overlay)
- (overlay-end helm-swoop-line-overlay))))
-
-;; helm action ------------------------------------------------
-
-(defadvice helm-next-line (around helm-swoop-next-line disable)
- (let ((helm-move-to-line-cycle-in-source t))
- ad-do-it
- (when (called-interactively-p 'any)
- (helm-swoop--move-line-action))))
-
-(defadvice helm-previous-line (around helm-swoop-previous-line disable)
- (let ((helm-move-to-line-cycle-in-source t))
- ad-do-it
- (when (called-interactively-p 'any)
- (helm-swoop--move-line-action))))
-
-(defadvice helm-toggle-visible-mark (around helm-swoop-toggle-visible-mark disable)
- (let ((helm-move-to-line-cycle-in-source t))
- ad-do-it
- (when (called-interactively-p 'any)
- (helm-swoop--move-line-action))))
-
-(defun helm-swoop--move-line-action ()
- (with-helm-window
- (let* (($key (helm-swoop--get-string-at-line))
- ($num (when (string-match "^[0-9]+" $key)
- (string-to-number (match-string 0 $key)))))
- ;; Synchronizing line position
- (when (and $key $num)
- (with-selected-window helm-swoop-synchronizing-window
- (progn
- (helm-swoop--goto-line $num)
- (with-current-buffer helm-swoop-target-buffer
- (delete-overlay helm-swoop-line-overlay)
- (helm-swoop--target-line-overlay-move))
- (helm-swoop--recenter)))
- (setq helm-swoop-last-line-info
- (cons helm-swoop-target-buffer $num))))))
-
-(defun helm-swoop--nearest-line ($target $list)
- "Return the nearest number of $target out of $list."
- (when (and $target $list)
- (let ($result)
- (cl-labels ((filter ($fn $elem $list)
- (let ($r)
- (mapc (lambda ($e)
- (if (funcall $fn $elem $e)
- (setq $r (cons $e $r))))
- $list) $r)))
- (if (eq 1 (length $list))
- (setq $result (car $list))
- (let* (($lts (filter '> $target $list))
- ($gts (filter '< $target $list))
- ($lt (if $lts (apply 'max $lts)))
- ($gt (if $gts (apply 'min $gts)))
- ($ltg (if $lt (- $target $lt)))
- ($gtg (if $gt (- $gt $target))))
- (setq $result
- (cond ((memq $target $list) $target)
- ((and (not $lt) (not $gt)) nil)
- ((not $gtg) $lt)
- ((not $ltg) $gt)
- ((eq $ltg $gtg) $gt)
- ((< $ltg $gtg) $lt)
- ((> $ltg $gtg) $gt)
- (t 1))))))
- $result)))
-
-(defun helm-swoop--keep-nearest-position ()
- (with-helm-window
- (let (($p (point-min)) $list $bound
- $nearest-line $target-point
- ($buf (rx-to-string (buffer-name (car helm-swoop-last-line-info)) t)))
- (save-excursion
- (goto-char $p)
- (while (if $p (setq $p (re-search-forward (concat "^" $buf "$") nil t)))
- (when (get-text-property (point-at-bol) 'helm-header)
- (forward-char 1)
- (setq $bound (next-single-property-change (point) 'helm-header))
- (while (re-search-forward "^[0-9]+" $bound t)
- (setq $list (cons
- (string-to-number (match-string 0))
- $list)))
- (setq $nearest-line (helm-swoop--nearest-line
- (cdr helm-swoop-last-line-info)
- $list))
- (goto-char $p)
- (re-search-forward (concat "^"
- (number-to-string $nearest-line)
- "\\s-") $bound t)
- (setq $target-point (point))
- (setq $p nil))))
- (when $target-point
- (goto-char $target-point)
- (helm-mark-current-line)
- (if (equal helm-swoop-buffer (buffer-name (current-buffer)))
- (helm-swoop--move-line-action)
- (helm-multi-swoop--move-line-action))))))
-
-(defun helm-swoop--pattern-match ()
- "Overlay target words"
- (with-helm-window
- (setq helm-swoop-pattern helm-pattern)
- (when (< 2 (length helm-pattern))
- (helm-swoop--delete-overlay 'target-buffer)
- (helm-swoop--target-word-overlay 'target-buffer)
- (with-selected-window helm-swoop-synchronizing-window
- (helm-swoop--delete-overlay 'target-buffer)
- (helm-swoop--target-word-overlay 'target-buffer)))))
-
-(defun helm-swoop-flash-word ($match-beg $match-end)
- (interactive)
- (unwind-protect
- (let (($o (make-overlay $match-beg $match-end)))
- (when $o
- (overlay-put $o 'face 'helm-swoop-target-word-face)
- (overlay-put $o 'helm-swoop-overlay-word-frash t)))
- (run-with-idle-timer
- 0.6 nil (lambda () (helm-swoop--delete-overlay 'helm-swoop-overlay-word-frash)))))
-
-;; core ------------------------------------------------
-
-(defun helm-swoop--get-content ($buffer &optional $linum)
- "Get the whole content in buffer and add line number at the head.
-If $linum is number, lines are separated by $linum"
- (let (($buf (get-buffer $buffer)))
- (when $buf
- (with-current-buffer $buf
- (let (($bufstr (helm-swoop--buffer-substring (point-min) (point-max)))
- $return)
- (with-temp-buffer
- (insert $bufstr)
- (goto-char (point-min))
- (let (($i 1))
- (insert (format "%s " $i))
- (while (re-search-forward "\n" nil t)
- (cl-incf $i)
- (if helm-swoop-use-line-number-face
- (insert (propertize (format "%s" $i) 'font-lock-face 'helm-swoop-line-number-face) " ")
- (insert (format "%s " $i))))
- ;; Delete empty lines
- (unless $linum
- (goto-char (point-min))
- (while (re-search-forward "^[0-9]+\\s-*$" nil t)
- (replace-match ""))))
- (setq $return (helm-swoop--buffer-substring (point-min) (point-max))))
- $return)))))
-
-(defun helm-c-source-swoop ()
- `((name . ,(buffer-name helm-swoop-target-buffer))
- (candidates . ,(if helm-swoop-list-cache
- (progn
- (helm-swoop--split-lines-by
- helm-swoop-list-cache "\n" helm-swoop-last-prefix-number))
- (helm-swoop--split-lines-by
- (setq helm-swoop-list-cache
- (helm-swoop--get-content helm-swoop-target-buffer t))
- "\n" helm-swoop-last-prefix-number)))
- (get-line . ,(if helm-swoop-speed-or-color
- 'helm-swoop--buffer-substring
- 'buffer-substring-no-properties))
- (keymap . ,helm-swoop-map)
- (header-line . "[C-c C-e] Edit mode, [M-i] apply all buffers")
- (action . (("Go to Line"
- . (lambda ($line)
- (helm-swoop--goto-line
- (when (string-match "^[0-9]+" $line)
- (string-to-number (match-string 0 $line))))
- (let (($regex
- (mapconcat 'identity
- (split-string helm-pattern " ")
- "\\|")))
- (when (or (and (and (featurep 'migemo) helm-migemo-mode)
- (migemo-forward $regex nil t))
- (re-search-forward $regex nil t))
- (helm-swoop-flash-word (match-beginning 0) (match-end 0))
- (goto-char (match-beginning 0))))
- (helm-swoop--recenter)))))
- ,(if (and helm-swoop-last-prefix-number
- (> helm-swoop-last-prefix-number 1))
- '(multiline))
- (match . ,(helm-swoop-match-functions))
- (search . ,(helm-swoop-search-functions))))
-
-(defun helm-c-source-multi-swoop ($buf $func $action $multiline)
- `((name . ,$buf)
- (candidates . ,(funcall $func))
- (action . ,$action)
- (header-line . ,(concat $buf " [C-c C-e] Edit mode"))
- (keymap . ,helm-multi-swoop-map)
- (requires-pattern . 2)
- ,(if (and $multiline
- (> $multiline 1))
- '(multiline))
- (match . ,(helm-swoop-match-functions))
- (search . ,(helm-swoop-search-functions))))
-
-(defun helm-swoop--set-prefix (&optional $multiline)
- ;; Enable scrolling margin
- (if (boundp 'helm-swoop-last-prefix-number)
- (setq helm-swoop-last-prefix-number
- (or $multiline 1)) ;; $multiline is for resume
- (set (make-local-variable 'helm-swoop-last-prefix-number)
- (or $multiline 1))))
-(helm-swoop--set-prefix) ;; Silence error "Warning: reference to free variable"
-
-;; Delete cache when modified file is saved
-(defun helm-swoop--clear-cache ()
- (if (boundp 'helm-swoop-list-cache) (setq helm-swoop-list-cache nil)))
-(add-hook 'after-save-hook 'helm-swoop--clear-cache)
-
-(defadvice narrow-to-region (around helm-swoop-advice-narrow-to-region activate)
- (helm-swoop--clear-cache)
- ad-do-it)
-(defadvice narrow-to-defun (around helm-swoop-advice-narrow-to-defun activate)
- (helm-swoop--clear-cache)
- ad-do-it)
-(defadvice narrow-to-page (around helm-swoop-advice-narrow-to-page activate)
- (helm-swoop--clear-cache)
- ad-do-it)
-(defadvice widen (around helm-swoop-advice-widen activate)
- (helm-swoop--clear-cache)
- ad-do-it)
-
-(defun helm-swoop--restore ()
- (when (= 1 helm-exit-status)
- (helm-swoop-back-to-last-point t)
- (helm-swoop--restore-unveiled-overlay))
- (setq helm-swoop-invisible-targets nil)
- (ad-disable-advice 'helm-next-line 'around 'helm-swoop-next-line)
- (ad-activate 'helm-next-line)
- (ad-disable-advice 'helm-previous-line 'around 'helm-swoop-previous-line)
- (ad-activate 'helm-previous-line)
- (ad-disable-advice 'helm-toggle-visible-mark 'around 'helm-swoop-toggle-visible-mark)
- (ad-activate 'helm-toggle-visible-mark)
- (ad-disable-advice 'helm-move--next-line-fn 'around
- 'helm-multi-swoop-next-line-cycle)
- (ad-activate 'helm-move--next-line-fn)
- (ad-disable-advice 'helm-move--previous-line-fn 'around
- 'helm-multi-swoop-previous-line-cycle)
- (ad-activate 'helm-move--previous-line-fn)
- (remove-hook 'helm-update-hook 'helm-swoop--pattern-match)
- (remove-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position)
- (setq helm-swoop-last-query helm-swoop-pattern)
- (mapc (lambda ($ov)
- (when (or (eq 'helm-swoop-target-line-face (overlay-get $ov 'face))
- (eq 'helm-swoop-target-line-block-face
- (overlay-get $ov 'face)))
- (delete-overlay $ov)))
- (overlays-in (point-min) (point-max)))
- (helm-swoop--delete-overlay 'target-buffer)
- (deactivate-mark t))
-
-;;;###autoload
-(cl-defun helm-swoop (&key $query $source ($multiline current-prefix-arg))
- "List the all lines to another buffer, which is able to squeeze by
- any words you input. At the same time, the original buffer's cursor
- is jumping line to line according to moving up and down the list."
- (interactive)
- (setq helm-swoop-synchronizing-window (selected-window))
- (setq helm-swoop-last-point (cons (point) (buffer-name (current-buffer))))
- (setq helm-swoop-last-line-info
- (cons (current-buffer) (line-number-at-pos)))
- (unless (boundp 'helm-swoop-last-query)
- (set (make-local-variable 'helm-swoop-last-query) ""))
- (setq helm-swoop-target-buffer (current-buffer))
- (helm-swoop--set-prefix (prefix-numeric-value $multiline))
- ;; Overlay
- (setq helm-swoop-line-overlay (make-overlay (point) (point)))
- (overlay-put helm-swoop-line-overlay
- 'face (if (< 1 helm-swoop-last-prefix-number)
- 'helm-swoop-target-line-block-face
- 'helm-swoop-target-line-face))
- ;; Cache
- (cond ((not (boundp 'helm-swoop-list-cache))
- (set (make-local-variable 'helm-swoop-list-cache) nil))
- ((buffer-modified-p)
- (setq helm-swoop-list-cache nil)))
- (unwind-protect
- (progn
- ;; For synchronizing line position
- (ad-enable-advice 'helm-next-line 'around 'helm-swoop-next-line)
- (ad-activate 'helm-next-line)
- (ad-enable-advice 'helm-previous-line 'around 'helm-swoop-previous-line)
- (ad-activate 'helm-previous-line)
- (ad-enable-advice 'helm-toggle-visible-mark 'around 'helm-swoop-toggle-visible-mark)
- (ad-activate 'helm-toggle-visible-mark)
- (ad-enable-advice 'helm-move--next-line-fn 'around
- 'helm-multi-swoop-next-line-cycle)
- (ad-activate 'helm-move--next-line-fn)
- (ad-enable-advice 'helm-move--previous-line-fn 'around
- 'helm-multi-swoop-previous-line-cycle)
- (ad-activate 'helm-move--previous-line-fn)
- (add-hook 'helm-update-hook 'helm-swoop--pattern-match)
- (add-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position t)
- (cond ($query
- (if (string-match
- "\\(\\^\\[0\\-9\\]\\+\\.\\)\\(.*\\)" $query)
- $query ;; NEED FIX #1 to appear as a "^"
- $query))
- (mark-active
- (let (($st (buffer-substring-no-properties
- (region-beginning) (region-end))))
- (if (string-match "\n" $st)
- (message "Multi line region is not allowed")
- (setq $query (helm-swoop-pre-input-optimize $st)))))
- ((setq $query (helm-swoop-pre-input-optimize
- (funcall helm-swoop-pre-input-function))))
- (t (setq $query "")))
- ;; First behavior
- (helm-swoop--recenter)
- (move-beginning-of-line 1)
- (helm-swoop--target-line-overlay-move)
- ;; Execute helm
- (let ((helm-display-function helm-swoop-split-window-function)
- (helm-display-source-at-screen-top nil)
- (helm-completion-window-scroll-margin 5))
- (helm :sources
- (or $source
- (helm-c-source-swoop))
- :buffer helm-swoop-buffer
- :input $query
- :prompt helm-swoop-prompt
- :preselect
- ;; Get current line has content or else near one
- (if (string-match "^[\t\n\s]*$" (helm-swoop--get-string-at-line))
- (save-excursion
- (if (re-search-forward "[^\t\n\s]" nil t)
- (format "^%s\s" (line-number-at-pos))
- (re-search-backward "[^\t\n\s]" nil t)
- (format "^%s\s" (line-number-at-pos))))
- (format "^%s\s" (line-number-at-pos)))
- :candidate-number-limit helm-swoop-candidate-number-limit)))
- ;; Restore helm's hook and window function etc
- (helm-swoop--restore)))
-
-;; Receive word from isearch ---------------
-;;;###autoload
-(defun helm-swoop-from-isearch ()
- "Invoke `helm-swoop' from isearch."
- (interactive)
- (let (($query (if isearch-regexp
- isearch-string
- (regexp-quote isearch-string))))
- (let (search-nonincremental-instead)
- (isearch-exit))
- (helm-swoop :$query $query)))
-;; When doing isearch, hand the word over to helm-swoop
-(define-key isearch-mode-map (kbd "M-i") 'helm-swoop-from-isearch)
-
-;; Receive word from evil search ---------------
-(defun helm-swoop-from-evil-search ()
- "Invoke `helm-swoop' from evil isearch"
- (interactive)
- (if (string-match "\\(isearch-\\|evil.*search\\)" (symbol-name real-last-command))
- (helm-swoop :$query (if isearch-regexp
- isearch-string
- (regexp-quote isearch-string)))
- (helm-swoop)))
-;; When doing evil-search, hand the word over to helm-swoop
-;; (define-key evil-motion-state-map (kbd "M-i") 'helm-swoop-from-evil-search)
-
-;; Receive word from evil search ---------------
-(defun helm-swoop-yank-thing-at-point ()
- "Insert string at which the point helm-swoop started."
- (interactive)
- (let ($amend $buf)
- (with-selected-window helm-swoop-synchronizing-window
- (setq $buf (get-buffer (cdr helm-swoop-last-point)))
- (when $buf
- (with-current-buffer $buf
- (save-excursion
- (goto-char (car helm-swoop-last-point))
- (setq $amend (thing-at-point 'symbol))))))
- (when $amend
- (with-selected-window (minibuffer-window)
- (insert $amend)))))
-
-;; For helm-resume ------------------------
-(defadvice helm-resume-select-buffer
- (around helm-swoop-if-selected-as-resume activate)
- "Resume if *Helm Swoop* buffer selected as a resume
- when helm-resume with prefix"
- (if (boundp 'helm-swoop-last-query)
- ad-do-it
- ;; If the buffer hasn't called helm-swoop, just hide from options
- (let ((helm-buffers (delete helm-swoop-buffer helm-buffers)))
- ad-do-it))
- (when (and (equal ad-return-value helm-swoop-buffer)
- (boundp 'helm-swoop-last-query))
- (helm-swoop :$query helm-swoop-last-query
- :$multiline helm-swoop-last-prefix-number)
- (setq ad-return-value nil)))
-
-(defadvice helm-resume (around helm-swoop-resume activate)
- "Resume if the last used helm buffer is helm-swoop-buffer"
- (if (equal helm-last-buffer helm-swoop-buffer)
- (if (boundp 'helm-swoop-last-query)
- (if (not (ad-get-arg 0))
- (helm-swoop :$query helm-swoop-last-query
- :$multiline helm-swoop-last-prefix-number))
- ;; Temporary apply second last buffer
- (let ((helm-last-buffer (cadr helm-buffers))) ad-do-it))
- ad-do-it))
-
-;; For caret beginning-match -----------------------------
-(defun helm-swoop--caret-match-delete ($o $aft $beg $end &optional $len)
- (if $aft
- (- $end $beg $len) ;; Unused argument? To avoid byte compile error
- (delete-region (overlay-start $o) (1- (overlay-end $o)))))
-
-(defun helm-swoop-caret-match (&optional _$resume)
- (interactive)
- (let* (($prompt helm-swoop-prompt) ;; Accept change of the variable
- ($line-number-regexp "^[0-9]+.")
- ($prompt-regexp
- (funcall `(lambda ()
- (rx bol ,$prompt))))
- ($prompt-regexp-with-line-number
- (funcall `(lambda ()
- (rx bol ,$prompt (group ,$line-number-regexp)))))
- ($disguise-caret
- (lambda ()
- (save-excursion
- (re-search-backward $prompt-regexp-with-line-number nil t)
- (let (($o (make-overlay (match-beginning 1) (match-end 1))))
- (overlay-put $o 'face 'helm-swoop-target-word-face)
- (overlay-put $o 'modification-hooks '(helm-swoop--caret-match-delete))
- (overlay-put $o 'display "^")
- (overlay-put $o 'evaporate t))))))
- (if (and (minibufferp)
- (string-match $prompt-regexp
- (buffer-substring-no-properties
- (point-min) (point-max)))
- (eq (point) (+ 1 (length helm-swoop-prompt))))
- (progn
- (insert $line-number-regexp)
- (funcall $disguise-caret))
- (insert "^"))))
-
-;;; @ helm-swoop-edit -----------------------------------------
-
-(defvar helm-swoop-edit-target-buffer)
-(defvar helm-swoop-edit-buffer "*Helm Swoop Edit*")
-(defvar helm-swoop-edit-map
- (let (($map (make-sparse-keymap)))
- (define-key $map (kbd "C-x C-s") 'helm-swoop--edit-complete)
- (define-key $map (kbd "C-c C-g") 'helm-swoop--edit-cancel)
- (define-key $map (kbd "C-c C-q C-k") 'helm-swoop--edit-delete-all-lines)
- $map))
-
-(defun helm-swoop--clear-edit-buffer ($prop)
- (let ((inhibit-read-only t))
- (mapc (lambda ($ov)
- (when (overlay-get $ov $prop)
- (delete-overlay $ov)))
- (overlays-in (point-min) (point-max)))
- (set-text-properties (point-min) (point-max) nil)
- (goto-char (point-min))
- (erase-buffer)))
-
-(defun helm-swoop--collect-edited-lines ()
- "Create a list of edited lines with each its own line number"
- (interactive)
- (let ($list)
- (goto-char (point-min))
- (while (re-search-forward "^\\([0-9]+\\)\s" nil t)
- (setq $list
- (cons (cons (string-to-number (match-string 1))
- (buffer-substring-no-properties
- (point)
- (save-excursion
- (if (re-search-forward
- "^\\([0-9]+\\)\s\\|^\\(\\-+\\)" nil t)
- (1- (match-beginning 0))
- (goto-char (point-max))
- (re-search-backward "\n" nil t)))))
- $list)))
- $list))
-
-(defun helm-swoop--edit ($candidate)
- "This function will only be called from `helm-swoop-edit'"
- (interactive)
- (setq helm-swoop-edit-target-buffer helm-swoop-target-buffer)
- (delete-overlay helm-swoop-line-overlay)
- (helm-swoop--delete-overlay 'target-buffer)
- (with-current-buffer (get-buffer-create helm-swoop-edit-buffer)
-
- (helm-swoop--clear-edit-buffer 'helm-swoop-edit)
- (let (($bufstr ""))
- ;; Get target line number to edit
- (with-current-buffer helm-swoop-buffer
- ;; Use selected line by [C-SPC] or [M-SPC]
- (mapc (lambda ($ov)
- (when (eq 'helm-visible-mark (overlay-get $ov 'face))
- (setq $bufstr (concat (buffer-substring-no-properties
- (overlay-start $ov) (overlay-end $ov))
- $bufstr))))
- (overlays-in (point-min) (point-max)))
- (if (equal "" $bufstr)
- ;; Not found selected line
- (setq $bufstr (buffer-substring-no-properties
- (point-min) (point-max)))
- ;; Attach title
- (setq $bufstr (concat "Helm Swoop\n" $bufstr))))
-
- ;; Set for edit buffer
- (insert $bufstr)
- (add-text-properties (point-min) (point-max)
- '(read-only t rear-nonsticky t front-sticky t))
-
- ;; Set for editable context
- (let ((inhibit-read-only t))
- ;; Title and explanation
- (goto-char (point-min))
- (let (($o (make-overlay (point) (point-at-eol))))
- (overlay-put $o 'helm-swoop-edit t)
- (overlay-put $o 'face 'font-lock-function-name-face)
- (overlay-put $o 'after-string
- (propertize
- (format " [%s] Complete, [%s] Cancel, [%s] Delete All"
- (helm-swoop--key-of-function 'helm-swoop--edit-complete helm-swoop-edit-map)
- (helm-swoop--key-of-function 'helm-swoop--edit-cancel helm-swoop-edit-map)
- (helm-swoop--key-of-function 'helm-swoop--edit-delete-all-lines helm-swoop-edit-map))
- 'face 'helm-bookmark-addressbook)))
- ;; Line number and editable area
- (while (re-search-forward "^\\([0-9]+\s\\)\\(.*\\)$" nil t)
- (let* (($bol1 (match-beginning 1))
- ($eol1 (match-end 1))
- ($bol2 (match-beginning 2))
- ($eol2 (match-end 2)))
- ;; Line number
- (add-text-properties $bol1 $eol1
- '(face font-lock-function-name-face
- intangible t))
- ;; Editable area
- (remove-text-properties $bol2 $eol2 '(read-only t))
- ;; For line tail
- (set-text-properties $eol2 (or (1+ $eol2) (point-max))
- '(read-only t rear-nonsticky t))))
- (helm-swoop--target-word-overlay 'edit-buffer 0))))
-
- (other-window 1)
- (switch-to-buffer helm-swoop-edit-buffer)
- (goto-char (point-min))
- (if (string-match "^[0-9]+" $candidate)
- (re-search-forward
- (concat "^" (match-string 0 $candidate)) nil t))
- (use-local-map helm-swoop-edit-map))
-
-(defun helm-swoop--edit-complete ()
- "Apply changes and kill temporary edit buffer"
- (interactive)
- (let (($list (helm-swoop--collect-edited-lines)))
- (with-current-buffer helm-swoop-edit-target-buffer
- ;; Replace from the end of buffer
- (save-excursion
- (mapc (lambda ($cell)
- (let (($k (car $cell))
- ($v (cdr $cell)))
- (goto-char (point-min))
- (delete-region (point-at-bol $k) (point-at-eol $k))
- (goto-char (point-at-bol $k))
- (insert $v)))
- $list)))
- (select-window helm-swoop-synchronizing-window)
- (kill-buffer (get-buffer helm-swoop-edit-buffer)))
- (message "Successfully helm-swoop-edit applied to original buffer"))
-
-(defun helm-swoop--edit-delete-all-lines ()
- "Apply changes and kill temporary edit buffer"
- (interactive)
- (let (($list (helm-swoop--collect-edited-lines)))
- (with-current-buffer helm-swoop-edit-target-buffer
- ;; Replace from the end of buffer
- (save-excursion
- (mapc (lambda ($cell)
- (let (($k (car $cell)))
- (goto-char (point-min))
- (delete-region (point-at-bol $k)
- (if (eq (point-at-eol $k) (point-max))
- (point-at-eol $k)
- (1+ (point-at-eol $k))))))
- $list)))
- (select-window helm-swoop-synchronizing-window)
- (kill-buffer (get-buffer helm-swoop-edit-buffer)))
- (message "Successfully helm-swoop-edit applied to original buffer"))
-
-(defun helm-swoop--edit-cancel ()
- "Cancel edit and kill temporary buffer"
- (interactive)
- (select-window helm-swoop-synchronizing-window)
- (kill-buffer (get-buffer helm-swoop-edit-buffer))
- (message "helm-swoop-edit canceled"))
-
-(defun helm-swoop-edit ()
- (interactive)
- (helm-exit-and-execute-action 'helm-swoop--edit))
-
-;;; @ helm-multi-swoop ----------------------------------------
-(defvar helm-multi-swoop-buffer-list "*helm-multi-swoop buffers list*"
- "Buffer name")
-(defvar helm-multi-swoop-ignore-buffers-match "^\\*"
- "Regexp to eliminate buffers you don't want to see")
-(defvar helm-multi-swoop-candidate-number-limit 250)
-(defvar helm-multi-swoop-last-selected-buffers nil)
-(defvar helm-multi-swoop-last-query nil)
-(defvar helm-multi-swoop-query nil)
-(defvar helm-multi-swoop-buffer "*Helm Multi Swoop*")
-(defvar helm-multi-swoop-all-from-helm-swoop-last-point nil
- "For the last position, when helm-multi-swoop-all-from-helm-swoop canceled")
-(defvar helm-multi-swoop-move-line-action-last-buffer nil)
-
-(defvar helm-multi-swoop-buffers-map
- (let (($map (make-sparse-keymap)))
- (set-keymap-parent $map helm-map)
- (define-key $map (kbd "RET")
- (lambda () (interactive)
- (helm-exit-and-execute-action 'helm-multi-swoop--exec)))
- (delq nil $map)))
-
-;; action -----------------------------------------------------
-
-(defadvice helm-next-line (around helm-multi-swoop-next-line disable)
- (let ((helm-move-to-line-cycle-in-source nil))
- ad-do-it
- (when (called-interactively-p 'any)
- (helm-multi-swoop--move-line-action))))
-
-(defadvice helm-previous-line (around helm-multi-swoop-previous-line disable)
- (let ((helm-move-to-line-cycle-in-source nil))
- ad-do-it
- (when (called-interactively-p 'any)
- (helm-multi-swoop--move-line-action))))
-
-(defadvice helm-toggle-visible-mark (around helm-multi-swoop-toggle-visible-mark disable)
- (let ((helm-move-to-line-cycle-in-source nil))
- ad-do-it
- (when (called-interactively-p 'any)
- (helm-multi-swoop--move-line-action))))
-
-(defadvice helm-move--next-line-fn (around helm-multi-swoop-next-line-cycle disable)
- (if (not (helm-pos-multiline-p))
- (if (eq (point-max) (save-excursion (forward-line 1) (point)))
- (when helm-swoop-move-to-line-cycle
- (helm-beginning-of-buffer)
- (helm-swoop--recenter))
- (forward-line 1))
- (let ((line-num (line-number-at-pos)))
- (helm-move--next-multi-line-fn)
- (when (and helm-swoop-move-to-line-cycle
- (eq line-num (line-number-at-pos)))
- (helm-beginning-of-buffer)))))
-
-(defadvice helm-move--previous-line-fn (around helm-multi-swoop-previous-line-cycle disable)
- (if (not (helm-pos-multiline-p))
- (forward-line -1)
- (helm-move--previous-multi-line-fn))
- (when (and (helm-pos-header-line-p)
- (eq (point) (save-excursion (forward-line -1) (point))))
- (when helm-swoop-move-to-line-cycle
- (helm-end-of-buffer))
- (when (helm-pos-multiline-p)
- (helm-move--previous-multi-line-fn))))
-
-(defun helm-multi-swoop--move-line-action ()
- (with-helm-window
- (let* (($key (buffer-substring (point-at-bol) (point-at-eol)))
- ($num (when (string-match "^[0-9]+" $key)
- (string-to-number (match-string 0 $key))))
- ($source (helm-get-current-source))
- ($buf (let (($name (assoc-default 'name $source)))
- (when $name (get-buffer $name)))))
- (when $buf
- ;; Synchronizing line position
- (with-selected-window helm-swoop-synchronizing-window
- (with-current-buffer $buf
- (when (not (eq $buf helm-multi-swoop-move-line-action-last-buffer))
- (set-window-buffer nil $buf)
- (helm-swoop--pattern-match))
- (helm-swoop--goto-line $num)
- (helm-swoop--target-line-overlay-move $buf)
- (helm-swoop--recenter))
- (setq helm-multi-swoop-move-line-action-last-buffer $buf))
- (setq helm-swoop-last-line-info (cons $buf $num))))))
-
-(defun helm-multi-swoop--get-marked-buffers ()
- (let ($list
- ($buf (get-buffer helm-multi-swoop-buffer-list)))
- (when $buf
- (with-current-buffer (get-buffer helm-multi-swoop-buffer-list)
- (mapc (lambda ($ov)
- (when (eq 'helm-visible-mark (overlay-get $ov 'face))
- (setq $list (cons
- (let (($word (buffer-substring-no-properties
- (overlay-start $ov) (overlay-end $ov))))
- (mapc (lambda ($r)
- (setq $word (replace-regexp-in-string
- (car $r) (cdr $r) $word)))
- (list '("\\`[ \t\n\r]+" . "")
- '("[ \t\n\r]+\\'" . "")))
- $word)
- $list))))
- (overlays-in (point-min) (point-max))))
- (delete "" $list))))
-
-;; core --------------------------------------------------------
-
-(cl-defun helm-multi-swoop--exec (ignored &key $query $buflist $func $action)
- (interactive)
- (setq helm-swoop-synchronizing-window (selected-window))
- (setq helm-swoop-last-point
- (or helm-multi-swoop-all-from-helm-swoop-last-point
- (cons (point) (buffer-name (current-buffer)))))
- (setq helm-swoop-last-line-info
- (cons (current-buffer) (line-number-at-pos)))
- (unless (get-buffer helm-multi-swoop-buffer-list)
- (get-buffer-create helm-multi-swoop-buffer-list))
- (helm-swoop--set-prefix (prefix-numeric-value current-prefix-arg))
- (let (($buffs (or $buflist
- (helm-multi-swoop--get-marked-buffers)
- `(,(buffer-name helm-swoop-target-buffer))
- (error "No buffer selected")))
- $contents
- $preserve-position
- ($prefix-arg (prefix-numeric-value
- (or current-prefix-arg helm-swoop-last-prefix-number 1))))
- (helm-swoop--set-prefix $prefix-arg)
- (setq helm-multi-swoop-last-selected-buffers $buffs)
- ;; Create buffer sources
- (mapc (lambda ($buf)
- (when (get-buffer $buf)
- (with-current-buffer (get-buffer $buf)
- (let* (($func
- (or $func
- (lambda ()
- (helm-swoop--split-lines-by
- (helm-swoop--get-content $buf t)
- "\n" $prefix-arg))))
- ($action
- (or $action
- `(("Go to Line"
- . (lambda ($line)
- (switch-to-buffer ,$buf)
- (helm-swoop--goto-line
- (when (string-match "^[0-9]+" $line)
- (string-to-number
- (match-string 0 $line))))
- (when (re-search-forward
- (mapconcat 'identity
- (split-string
- helm-pattern " ") "\\|")
- nil t)
- (helm-swoop-flash-word (match-beginning 0) (match-end 0))
- (goto-char (match-beginning 0)))
- (helm-swoop--recenter)))))))
- (setq $preserve-position
- (cons (cons $buf (point)) $preserve-position))
- (setq
- $contents
- (cons
- (helm-c-source-multi-swoop $buf $func $action $prefix-arg)
- $contents))))))
- $buffs)
- (unwind-protect
- (progn
- (ad-enable-advice 'helm-next-line 'around
- 'helm-multi-swoop-next-line)
- (ad-activate 'helm-next-line)
- (ad-enable-advice 'helm-previous-line 'around
- 'helm-multi-swoop-previous-line)
- (ad-activate 'helm-previous-line)
- (ad-enable-advice 'helm-toggle-visible-mark 'around
- 'helm-multi-swoop-toggle-visible-mark)
- (ad-activate 'helm-toggle-visible-mark)
- (ad-enable-advice 'helm-move--next-line-fn 'around
- 'helm-multi-swoop-next-line-cycle)
- (ad-activate 'helm-move--next-line-fn)
- (ad-enable-advice 'helm-move--previous-line-fn 'around
- 'helm-multi-swoop-previous-line-cycle)
- (ad-activate 'helm-move--previous-line-fn)
- (add-hook 'helm-update-hook 'helm-swoop--pattern-match)
- (add-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position t)
- (setq helm-swoop-line-overlay
- (make-overlay (point) (point)))
- (overlay-put helm-swoop-line-overlay
- 'face 'helm-swoop-target-line-face)
- (helm-swoop--target-line-overlay-move)
- ;; Execute helm
- (let ((helm-display-function helm-swoop-split-window-function)
- (helm-display-source-at-screen-top nil)
- (helm-completion-window-scroll-margin 5))
- (helm :sources $contents
- :buffer helm-multi-swoop-buffer
- :input (or $query helm-multi-swoop-query "")
- :prompt helm-swoop-prompt
- :candidate-number-limit
- helm-multi-swoop-candidate-number-limit
- :preselect
- (format "%s %s" (line-number-at-pos)
- (helm-swoop--get-string-at-line)))))
- ;; Restore
- (progn
- (when (= 1 helm-exit-status)
- (helm-swoop-back-to-last-point t)
- (helm-swoop--restore-unveiled-overlay))
- (setq helm-swoop-invisible-targets nil)
- (ad-disable-advice 'helm-next-line 'around
- 'helm-multi-swoop-next-line)
- (ad-activate 'helm-next-line)
- (ad-disable-advice 'helm-previous-line 'around
- 'helm-multi-swoop-previous-line)
- (ad-activate 'helm-previous-line)
- (ad-disable-advice 'helm-toggle-visible-mark 'around
- 'helm-multi-swoop-toggle-visible-mark)
- (ad-activate 'helm-toggle-visible-mark)
- (ad-disable-advice 'helm-move--next-line-fn 'around
- 'helm-multi-swoop-next-line-cycle)
- (ad-activate 'helm-move--next-line-fn)
- (ad-disable-advice 'helm-move--previous-line-fn 'around
- 'helm-multi-swoop-previous-line-cycle)
- (ad-activate 'helm-move--previous-line-fn)
- (remove-hook 'helm-update-hook 'helm-swoop--pattern-match)
- (remove-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position)
- (setq helm-multi-swoop-last-query helm-swoop-pattern)
- (helm-swoop--restore-unveiled-overlay)
- (setq helm-multi-swoop-query nil)
- (setq helm-multi-swoop-all-from-helm-swoop-last-point nil)
- (mapc (lambda ($buf)
- (let (($current-buffer (buffer-name (current-buffer))))
- (with-current-buffer (car $buf)
- ;; Delete overlay
- (delete-overlay helm-swoop-line-overlay)
- (helm-swoop--delete-overlay 'target-buffer)
- ;; Restore each buffer's position
- (unless (equal (car $buf) $current-buffer)
- (goto-char (cdr $buf))))))
- $preserve-position)))))
-
-(defun helm-multi-swoop--get-buffer-list ()
- (let ($buflist1 $buflist2)
- ;; eliminate buffers start with whitespace and dired buffers
- (mapc (lambda ($buf)
- (setq $buf (buffer-name $buf))
- (unless (string-match "^\\s-" $buf)
- (unless (eq 'dired-mode (with-current-buffer $buf major-mode))
- (setq $buflist1 (cons $buf $buflist1)))))
- (buffer-list))
- ;; eliminate buffers match pattern
- (mapc (lambda ($buf)
- (unless (string-match
- helm-multi-swoop-ignore-buffers-match
- $buf)
- (setq $buflist2 (cons $buf $buflist2))))
- $buflist1)
- $buflist2))
-
-(defun helm-c-source-helm-multi-swoop-buffers ()
- "Show buffer list to select"
- `((name . "helm-multi-swoop select buffers")
- (candidates . helm-multi-swoop--get-buffer-list)
- (header-line . "[C-SPC]/[M-SPC] select, [RET] next step")
- (keymap . ,helm-multi-swoop-buffers-map)
- (match . ,(helm-swoop-match-functions))
- (search . ,(helm-swoop-search-functions))))
-
-;;;###autoload
-(defun helm-multi-swoop (&optional $query $buflist)
- "\
-Usage:
-M-x helm-multi-swoop
-1. Select any buffers by [C-SPC] or [M-SPC]
-2. Press [RET] to start helm-multi-swoop
-
-C-u M-x helm-multi-swoop
-If you have done helm-multi-swoop before, you can skip select buffers step.
-Last selected buffers will be applied to helm-multi-swoop.
-"
- (interactive)
- (cond ($query
- (setq helm-multi-swoop-query $query))
- (mark-active
- (let (($st (buffer-substring-no-properties
- (region-beginning) (region-end))))
- (if (string-match "\n" $st)
- (message "Multi line region is not allowed")
- (setq helm-multi-swoop-query
- (helm-swoop-pre-input-optimize $st)))))
- ((setq helm-multi-swoop-query
- (helm-swoop-pre-input-optimize
- (funcall helm-swoop-pre-input-function))))
- (t (setq helm-multi-swoop-query "")))
- (if (equal current-prefix-arg '(4))
- (helm-multi-swoop--exec nil
- :$query helm-multi-swoop-query
- :$buflist $buflist)
- (if $buflist
- (helm-multi-swoop--exec nil
- :$query $query
- :$buflist $buflist)
- (helm :sources (helm-c-source-helm-multi-swoop-buffers)
- :buffer helm-multi-swoop-buffer-list
- :prompt "Mark any buffers by [C-SPC] or [M-SPC]: "))))
-
-;;;###autoload
-(defun helm-multi-swoop-all (&optional $query)
- "Apply all buffers to helm-multi-swoop"
- (interactive)
- (cond ($query
- (setq helm-multi-swoop-query $query))
- (mark-active
- (let (($st (buffer-substring-no-properties
- (region-beginning) (region-end))))
- (if (string-match "\n" $st)
- (message "Multi line region is not allowed")
- (setq helm-multi-swoop-query
- (helm-swoop-pre-input-optimize $st)))))
- ((setq helm-multi-swoop-query
- (helm-swoop-pre-input-optimize
- (funcall helm-swoop-pre-input-function))))
- (t (setq helm-multi-swoop-query "")))
- (helm-multi-swoop--exec nil
- :$query helm-multi-swoop-query
- :$buflist (helm-multi-swoop--get-buffer-list)))
-
-(defun get-buffers-matching-mode ($mode)
- "Returns a list of buffers where their major-mode is equal to MODE"
- (let ($buffer-mode-matches)
- (mapc (lambda ($buf)
- (when (get-buffer $buf)
- (with-current-buffer (get-buffer $buf)
- (if (eq $mode major-mode)
- (add-to-list '$buffer-mode-matches (buffer-name $buf))))))
- (buffer-list))
- $buffer-mode-matches))
-
-(defun helm-multi-swoop-by-mode ($mode &optional $query)
- "Apply all buffers whose mode is MODE to helm-multi-swoop"
- (cond ($query
- (setq helm-multi-swoop-query $query))
- (mark-active
- (let (($st (buffer-substring-no-properties
- (region-beginning) (region-end))))
- (if (string-match "\n" $st)
- (message "Multi line region is not allowed")
- (setq helm-multi-swoop-query
- (helm-swoop-pre-input-optimize $st)))))
- ((setq helm-multi-swoop-query
- (helm-swoop-pre-input-optimize
- (funcall helm-swoop-pre-input-function))))
- (t (setq helm-multi-swoop-query "")))
- (if (get-buffers-matching-mode $mode)
- (helm-multi-swoop--exec nil
- :$query helm-multi-swoop-query
- :$buflist (get-buffers-matching-mode $mode))
- (message "there are no buffers in that mode right now")))
-
-;;;###autoload
-(defun helm-multi-swoop-org (&optional $query)
- "Applies all org-mode buffers to helm-multi-swoop"
- (interactive)
- (helm-multi-swoop-by-mode 'org-mode $query))
-
-;;;###autoload
-(defun helm-multi-swoop-current-mode (&optional $query)
- "Applies all buffers of the same mode as the current buffer to helm-multi-swoop"
- (interactive)
- (helm-multi-swoop-by-mode major-mode $query))
-
-(defun helm-swoop--wrap-function-with-pre-input-function ($target-func $pre-input-func)
- (let (($restore helm-swoop-pre-input-function))
- (unwind-protect
- (progn
- (setq helm-swoop-pre-input-function $pre-input-func)
- (funcall $target-func))
- (setq helm-swoop-pre-input-function $restore))))
-
-;;;###autoload
-(defun helm-swoop-without-pre-input ()
- "Start helm-swoop without pre input query."
- (interactive)
- (helm-swoop--wrap-function-with-pre-input-function
- 'helm-swoop (lambda () nil)))
-
-;;;###autoload
-(defun helm-swoop-symble-pre-input ()
- "Start helm-swoop without pre input query."
- (interactive)
- (helm-swoop--wrap-function-with-pre-input-function
- 'helm-swoop (lambda () (format "\\_<%s\\_> " (thing-at-point 'symbol)))))
-
-;; option -------------------------------------------------------
-
-(defun helm-multi-swoop-all-from-isearch ()
- "Invoke `helm-multi-swoop-all' from isearch."
- (interactive)
- (let (($query (if isearch-regexp
- isearch-string
- (regexp-quote isearch-string))))
- (let (search-nonincremental-instead)
- (isearch-exit))
- (helm-multi-swoop-all $query)))
-;; When doing isearch, hand the word over to helm-swoop
-;; (define-key isearch-mode-map (kbd "C-x M-i") 'helm-multi-swoop-all-from-isearch)
-
-(defun helm-multi-swoop-all-from-helm-swoop ()
- "Invoke `helm-multi-swoop-all' from helm-swoop."
- (interactive)
- (helm-swoop--restore)
- (delete-overlay helm-swoop-line-overlay)
- (setq helm-multi-swoop-all-from-helm-swoop-last-point helm-swoop-last-point)
- (let (($query helm-pattern))
- (run-with-timer 0 nil (lambda () (helm-multi-swoop-all $query))))
- (helm-exit-minibuffer))
-
-(defun helm-multi-swoop-current-mode-from-helm-swoop ()
- "Invoke `helm-multi-swoop-all' from helm-swoop."
- (interactive)
- (helm-swoop--restore)
- (delete-overlay helm-swoop-line-overlay)
- (setq helm-multi-swoop-all-from-helm-swoop-last-point helm-swoop-last-point)
- (let (($query helm-pattern))
- (run-with-timer 0 nil (lambda () (helm-multi-swoop-current-mode $query))))
- (helm-exit-minibuffer))
-;; (define-key helm-swoop-map (kbd "M-m") 'helm-multi-swoop-current-mode-from-helm-swoop)
-
-(defadvice helm-resume (around helm-multi-swoop-resume activate)
- "Resume if the last used helm buffer is *Helm Swoop*"
- (if (equal helm-last-buffer helm-multi-swoop-buffer)
-
- (if (boundp 'helm-multi-swoop-last-query)
- (if (not (ad-get-arg 0))
- (helm-multi-swoop helm-multi-swoop-last-query
- helm-multi-swoop-last-selected-buffers))
- ;; Temporary apply second last buffer
- (let ((helm-last-buffer (cadr helm-buffers))) ad-do-it))
- ad-do-it))
-
-;;; @ helm-multi-swoop-edit -----------------------------------
-(defvar helm-multi-swoop-edit-save t
- "Save each buffer you edit when editing is complete")
-(defvar helm-multi-swoop-edit-buffer "*Helm Multi Swoop Edit*")
-
-(defvar helm-multi-swoop-edit-map
- (let (($map (make-sparse-keymap)))
- (define-key $map (kbd "C-x C-s") 'helm-multi-swoop--edit-complete)
- (define-key $map (kbd "C-c C-g") 'helm-multi-swoop--edit-cancel)
- (define-key $map (kbd "C-c C-q C-k") 'helm-multi-swoop--edit-delete-all-lines)
- $map))
-
-(defun helm-multi-swoop--edit ($candidate)
- "This function will only be called from `helm-swoop-edit'"
- (interactive)
- (delete-overlay helm-swoop-line-overlay)
- (helm-swoop--delete-overlay 'target-buffer)
- (with-current-buffer (get-buffer-create helm-multi-swoop-edit-buffer)
- (helm-swoop--clear-edit-buffer 'helm-multi-swoop-edit)
- (let (($bufstr "")
- ($mark nil)
- ($buf (get-buffer helm-multi-swoop-buffer)))
- ;; Get target line number to edit
- (when $buf
- (with-current-buffer $buf
- ;; Set overlay to helm-source-header for editing marked lines
- (save-excursion
- (goto-char (point-min))
- (let (($beg (point)) $end)
- (overlay-recenter (point-max))
- (while (setq $beg (text-property-any $beg (point-max)
- 'face 'helm-source-header))
- (setq $end (next-single-property-change $beg 'face))
- (overlay-put (make-overlay $beg $end) 'source-header t)
- (setq $beg $end)
- (goto-char $end))))
- ;; Use selected line by [C-SPC] or [M-SPC]
- (mapc (lambda ($ov)
- (when (overlay-get $ov 'source-header)
- (setq $bufstr (concat (buffer-substring
- (overlay-start $ov) (overlay-end $ov))
- $bufstr)))
- (when (eq 'helm-visible-mark (overlay-get $ov 'face))
- (let (($str (buffer-substring (overlay-start $ov) (overlay-end $ov))))
- (unless (equal "" $str) (setq $mark t))
- (setq $bufstr (concat (buffer-substring
- (overlay-start $ov) (overlay-end $ov))
- $bufstr)))))
- (overlays-in (point-min) (point-max)))
- (if $mark
- (progn (setq $bufstr (concat "Helm Multi Swoop\n" $bufstr))
- (setq $mark nil))
- (setq $bufstr (concat "Helm Multi Swoop\n"
- (buffer-substring
- (point-min) (point-max)))))))
-
- ;; Set for edit buffer
- (insert $bufstr)
- (add-text-properties (point-min) (point-max)
- '(read-only t rear-nonsticky t front-sticky t))
-
- ;; Set for editable context
- (let ((inhibit-read-only t))
- ;; Title and explanation
- (goto-char (point-min))
- (let (($o (make-overlay (point) (point-at-eol))))
- (overlay-put $o 'helm-multi-swoop-edit t)
- (overlay-put $o 'face 'font-lock-function-name-face)
- (overlay-put $o 'after-string
- (propertize
- (format " [%s] Complete, [%s] Cancel, [%s] Delete All"
- (helm-swoop--key-of-function 'helm-swoop--edit-complete helm-swoop-edit-map)
- (helm-swoop--key-of-function 'helm-swoop--edit-cancel helm-swoop-edit-map)
- (helm-swoop--key-of-function 'helm-swoop--edit-delete-all-lines helm-swoop-edit-map))
- 'face 'helm-bookmark-addressbook)))
- ;; Line number and editable area
- (while (re-search-forward "^\\([0-9]+\s\\)\\(.*\\)$" nil t)
- (let* (($bol1 (match-beginning 1))
- ($eol1 (match-end 1))
- ($bol2 (match-beginning 2))
- ($eol2 (match-end 2)))
-
- ;; Line number
- (add-text-properties $bol1 $eol1
- '(face font-lock-function-name-face
- intangible t))
- ;; Editable area
- (remove-text-properties $bol2 $eol2 '(read-only t))
- ;; (add-text-properties $bol2 $eol2 '(font-lock-face helm-match))
-
- ;; For line tail
- (set-text-properties $eol2 (or (1+ $eol2) (point-max))
- '(read-only t rear-nonsticky t))))
- (helm-swoop--target-word-overlay 'edit-buffer 0))))
-
- (other-window 1)
- (switch-to-buffer helm-multi-swoop-edit-buffer)
- (goto-char (point-min))
- (if (string-match "^[0-9]+" $candidate)
- (re-search-forward
- (concat "^" (match-string 0 $candidate)) nil t))
- (use-local-map helm-multi-swoop-edit-map))
-
-(defun helm-multi-swoop--separate-text-property-into-list ($property)
- (interactive)
- (let ($list $end)
- (save-excursion
- (goto-char (point-min))
- (while (setq $end (next-single-property-change (point) $property))
- ;; Must eliminate last return because of unexpected edit result
- (setq $list (cons
- (let (($str (buffer-substring-no-properties (point) $end)))
- (if (string-match "\n\n\\'" $str)
- (replace-regexp-in-string "\n\\'" "" $str)
- $str))
- $list))
- (goto-char $end))
- (setq $list (cons (buffer-substring-no-properties (point) (point-max))
- $list)))
- (nreverse $list)))
-
-(defun helm-multi-swoop--collect-edited-lines ()
- "Create a list of edited lines with each its own line number"
- (interactive)
- (let* (($list
- (helm-multi-swoop--separate-text-property-into-list 'helm-header))
- ($length (length $list))
- ($i 1) ;; 0th $list is header
- $pairs)
- (while (<= $i $length)
- (let ($contents)
- ;; Make ((number . line) (number . line) (number . line) ...)
- (with-temp-buffer
- (insert (format "%s" (nth (1+ $i) $list)))
- (goto-char (point-min))
- (while (re-search-forward "^\\([0-9]+\\)\s" nil t)
- (setq $contents
- (cons (cons (string-to-number (match-string 1))
- (buffer-substring-no-properties
- (point)
- (save-excursion
- (if (re-search-forward
- "^\\([0-9]+\\)\s\\|^\\(\\-+\\)" nil t)
- (1- (match-beginning 0))
- (goto-char (point-max))
- (re-search-backward "\n" nil t)))))
- $contents))))
- ;; Make ((buffer-name (number . line) (number . line) ...)
- ;; (buffer-name (number . line) (number . line) ...) ...)
- (setq $pairs (cons (cons (nth $i $list) $contents) $pairs)))
- (setq $i (+ $i 2)))
- (delete '(nil) $pairs)))
-
-(defun helm-multi-swoop--edit-complete ()
- "Delete all extracted lines, and apply changes to buffers and kill temporary edit buffer"
- (interactive)
- (let (($list (helm-multi-swoop--collect-edited-lines))
- $read-only)
- (mapc (lambda ($x)
- (with-current-buffer (car $x)
- (unless buffer-read-only
- (save-excursion
- (mapc (lambda ($cell)
- (let (($k (car $cell))
- ($v (cdr $cell)))
- (goto-char (point-min))
- (delete-region (point-at-bol $k) (point-at-eol $k))
- (goto-char (point-at-bol $k))
- (insert $v)))
- (cdr $x))))
- (if helm-multi-swoop-edit-save
- (if buffer-read-only
- (setq $read-only t)
- (save-buffer)))))
- $list)
- (select-window helm-swoop-synchronizing-window)
- (kill-buffer (get-buffer helm-multi-swoop-edit-buffer))
- (if $read-only
- (message "Couldn't save some buffers because of read-only")
- (message "Successfully helm-multi-swoop-edit applied to original buffer"))))
-
-(defun helm-multi-swoop--edit-delete-all-lines ()
- "Delete all extracted lines, and apply changes to buffers and kill temporary edit buffer"
- (interactive)
- (let (($list (helm-multi-swoop--collect-edited-lines))
- $read-only)
- (mapc (lambda ($x)
- (with-current-buffer (car $x)
- (unless buffer-read-only
- (save-excursion
- (mapc (lambda ($cell)
- (let (($k (car $cell)))
- (goto-char (point-min))
- (delete-region (point-at-bol $k)
- (if (eq (point-at-eol $k) (point-max))
- (point-at-eol $k)
- (1+ (point-at-eol $k))))))
- (cdr $x))))
- (if helm-multi-swoop-edit-save
- (if buffer-read-only
- (setq $read-only t)
- (save-buffer)))))
- $list)
- (select-window helm-swoop-synchronizing-window)
- (kill-buffer (get-buffer helm-multi-swoop-edit-buffer))
- (if $read-only
- (message "Couldn't save some buffers because of read-only")
- (message "Successfully helm-multi-swoop-edit applied to original buffer"))))
-
-(defun helm-multi-swoop--edit-cancel ()
- "Cancel edit and kill temporary buffer"
- (interactive)
- (select-window helm-swoop-synchronizing-window)
- (kill-buffer (get-buffer helm-multi-swoop-edit-buffer))
- (message "helm-multi-swoop-edit canceled"))
-
-;;;###autoload
-(defun helm-multi-swoop-edit ()
- (interactive)
- (helm-exit-and-execute-action 'helm-multi-swoop--edit))
-
-;;; @ helm-swoop-same-face-at-point -----------------------------------
-
-(defsubst helm-swoop--get-at-face (&optional $point)
- (or $point (setq $point (point)))
- (let (($face (or (get-char-property $point 'read-face-name)
- (get-char-property $point 'face))))
- $face))
-
-(defun helm-swoop--cull-face-include-line ($face)
- (let (($list) ($po (point-min)))
- (save-excursion
- (while (setq $po (next-single-property-change $po 'face))
- (when (equal $face (helm-swoop--get-at-face $po))
- (goto-char $po)
- (setq $list (cons (format "%s %s"
- (line-number-at-pos $po)
- (buffer-substring (point-at-bol) (point-at-eol)))
- $list))
- (let (($ov (make-overlay $po (or (next-single-property-change $po 'face)
- (point-max)))))
- (overlay-put $ov 'face 'helm-swoop-target-word-face)
- (overlay-put $ov 'target-buffer 'helm-swoop-target-word-face)))))
- (nreverse (delete-dups $list))))
-
-(defun helm-swoop-same-face-at-point (&optional $face)
- (interactive)
- (or $face (setq $face (helm-swoop--get-at-face)))
- (helm-swoop :$query ""
- :$source
- `((name . "helm-swoop-same-face-at-point")
- (candidates . ,(helm-swoop--cull-face-include-line $face))
- (header-line . ,(format "%s" $face))
- (action
- . (("Go to Line"
- . (lambda ($line)
- (helm-swoop--goto-line
- (when (string-match "^[0-9]+" $line)
- (string-to-number (match-string 0 $line))))
- (let (($po (point))
- ($poe (point-at-eol)))
- (while (<= (setq $po (next-single-property-change $po 'face)) $poe)
- (when (eq 'helm-swoop-target-word-face (helm-swoop--get-at-face $po))
- (goto-char $po))))
- (helm-swoop--recenter))))))))
-
-(defun helm-multi-swoop-same-face-at-point (&optional $face)
- (interactive)
- (or $face (setq $face (helm-swoop--get-at-face)))
- (helm-multi-swoop--exec
- nil
- :$query ""
- :$func (lambda () (helm-swoop--cull-face-include-line $face))
- :$action (lambda ($line)
- (switch-to-buffer (assoc-default 'name (helm-get-current-source)))
- (helm-swoop--goto-line
- (when (string-match "^[0-9]+" $line)
- (string-to-number (match-string 0 $line))))
- (let (($po (point))
- ($poe (point-at-eol)))
- (while (<= (setq $po (next-single-property-change $po 'face)) $poe)
- (when (eq 'helm-swoop-target-word-face (helm-swoop--get-at-face $po))
- (goto-char $po))))
- (helm-swoop--recenter))
- :$buflist (helm-multi-swoop--get-buffer-list)))
-
-(provide 'helm-swoop)
-;;; helm-swoop.el ends here