Skip to content

Instantly share code, notes, and snippets.

@alphapapa
Created May 31, 2018 04:03
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alphapapa/2489bf6e06b8a004b077b43df1e92cdb to your computer and use it in GitHub Desktop.
Save alphapapa/2489bf6e06b8a004b077b43df1e92cdb to your computer and use it in GitHub Desktop.
Custom Helm find-files command
(defun ap/helm-find-files ()
(interactive)
(helm :sources '(ap/helm-source-ivy-views
ap/helm-source-current-file-other-buffers
helm-source-buffers-list
ap/helm-source-files-in-current-dir
helm-source-org-recent-headings
helm-source-bookmarks
ap/helm-source-recentf
ap/helm-source-bindir
ap/helm-source-projectile-files-list)))
(defvar ap/helm-source-current-file-other-buffers
(helm-build-sync-source " Current file's other buffers"
:action #'switch-to-buffer
:candidates (lambda ()
(mapcar 'buffer-name
(-when-let (indirect-buffers (ap/current-file-indirect-buffers helm-current-buffer))
(-when-let (base-buffer (buffer-base-buffer helm-current-buffer))
;; Add the base buffer if current buffer is indirect
(push base-buffer indirect-buffers))
;; Remove current-buffer from list
(--remove (eq it helm-current-buffer) indirect-buffers))))))
(defun ap/current-file-indirect-buffers (&optional buffer)
"Return list of indirect buffers backed by BUFFER's file.
If BUFFER is nil, the current buffer is used."
(let ((buffer (or buffer (current-buffer))))
(ap/indirect-buffers-for-base-buffer (or (buffer-base-buffer buffer)
buffer))))
(defvar ap/helm-source-files-in-current-dir
(helm-make-source " Files in current directory" 'helm-files-in-current-dir-source
:candidate-number-limit 10))
(defvar ap/helm-source-recentf
(helm-make-source "Recentf" 'helm-recentf-source
:candidate-number-limit 10)
"My version of `helm-source-recentf'.")
(defvar ap/helm-source-bindir
`((name . "~/.bin")
(candidates . ,(lambda ()
(ap/directory-files-memoized "~/.bin" t directory-files-no-dot-files-regexp)))
(action . ,(lambda (x)
(find-file x)))
(candidate-number-limit . 10)))
(require 'memoize)
(defalias 'ap/directory-files-memoized
(memoize (symbol-function 'directory-files) "1 minute"))
(defvar ap/helm-source-projectile-files-list
;; Copied from helm-source-projectile-files-list
(helm-build-sync-source "Projectile files"
:candidates (lambda ()
(ignore-errors
(ap/expand-projectile-project-files-memoized (projectile-project-root))))
:fuzzy-match helm-projectile-fuzzy-match
:keymap helm-projectile-find-file-map
:help-message 'helm-ff-help-message
:mode-line helm-read-file-name-mode-line-string
:action helm-projectile-file-actions
:persistent-action #'helm-projectile-file-persistent-action
:persistent-help "Preview file"
:candidate-number-limit 10)
"Helm source definition for Projectile files.")
(defalias 'ap/expand-projectile-project-files-memoized
(memoize (symbol-function 'ap/expand-projectile-project-files) "5 minutes"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment