Helm: Define helm-defswitcher macro

master
Pierre Neidhardt 2019-02-22 17:55:23 +01:00
parent fda4f4d498
commit 7027282244
2 changed files with 46 additions and 49 deletions

View File

@ -257,55 +257,16 @@ This should be faster then `seq-uniq'."
;; (add-hook 'eshell-mode-hook 'ambrevar/fix-local-epa-file-encrypt-to)
;;; Spawning
(defvar helm-eshell-buffers-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map helm-map)
(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 "M-D") 'helm-buffer-run-kill-buffers)
map)
"Keymap for browser source in Helm.")
(require 'patch-helm)
(defun ambrevar/helm-buffer-transformer (buffers)
(mapcar #'buffer-name buffers))
(defun ambrevar/helm-eshell-buffers ()
"Yet another smart buffer switcher with `helm'."
(interactive)
(helm-build-sync-source "Eshell buffers"
:candidates (seq-filter (lambda (b) (with-current-buffer b
(derived-mode-p 'eshell-mode)))
(buffer-list))
:candidate-transformer #'ambrevar/helm-buffer-transformer
;; :filtered-candidate-transformer #'helm-highlight-buffers
:action `(("Switch to buffer(s)" . helm-buffer-switch-buffers)
(,(substitute-command-keys "Switch to buffer(s) in other window \\<helm-eshell-buffers-map>`\\[helm-buffer-switch-other-window]'")
. helm-buffer-switch-buffers-other-window)
(,(substitute-command-keys "Switch to buffer in other frame \\<helm-eshell-buffers-map>`\\[helm-buffer-switch-other-frame]'")
. switch-to-buffer-other-frame)
(,(substitute-command-keys "Kill buffer(s) \\<helm-eshell-buffers-map>`\\[helm-buffer-run-kill-buffers]'")
. helm-kill-marked-buffers))
:keymap helm-eshell-buffers-map
:persistent-action 'helm-buffers-list-persistent-action))
(add-to-list 'helm-source-names-using-follow "Eshell buffers")
(defun ambrevar/helm-eshell-new (name)
"Fetch URL and render the page in a new buffer.
If the input doesn't look like an URL or a domain name, the
word(s) will be searched for via `eww-search-prefix'."
(eshell 'new)
(rename-buffer (format "*eshell<%s>*" name) 'unique))
(defvar ambrevar/helm-eshell-new
(helm-build-dummy-source "Open new Eshell"
:action (helm-make-actions "Open new Eshell" 'ambrevar/helm-eshell-new-buffer)))
(defun ambrevar/helm-eshell-mini ()
"Helm for Eshell buffers."
(interactive)
(helm :sources (list (ambrevar/helm-eshell-buffers)
'ambrevar/helm-eshell-new)
:buffer "*helm-eshell-mini*"))
(helm-defswitcher
"Eshell"
(lambda (b)
(with-current-buffer b
(derived-mode-p 'eshell-mode)))
(lambda (name)
(eshell 'new)
(rename-buffer (format "*eshell<%s>*" name) 'unique)))
(defun ambrevar/eshell-or-new-session (&optional arg)
"Create an interactive Eshell buffer.
@ -314,7 +275,7 @@ Otherwise create a new one and switch to it.
See `eshell' for the numeric prefix ARG."
(interactive "P")
(if (or arg (eq major-mode 'eshell-mode))
(ambrevar/helm-eshell-mini)
(helm-eshell-buffers)
;; (eshell (or arg t))
(let ((last (buffer-list)))
(while (and last

View File

@ -0,0 +1,36 @@
(defvar helm-buffer-switcher-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map helm-map)
(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 "M-D") 'helm-buffer-run-kill-buffers)
map)
"Keymap for buffer switcher source in Helm.")
(defun helm-buffer-transformer (buffers)
(mapcar #'buffer-name buffers))
(defmacro helm-defswitcher (name predicate new-fn &optional extra-sources)
(let ((buffer-source-name (format "%s buffers" name)))
(add-to-list 'helm-source-names-using-follow buffer-source-name)
`(defun ,(intern (format "helm-%s-buffers" (downcase name))) ()
(interactive)
(helm :sources
(list (helm-build-sync-source ,buffer-source-name
:candidates (seq-filter ,predicate (buffer-list))
:candidate-transformer #'helm-buffer-transformer
:action '(("Switch to buffer(s)" . helm-buffer-switch-buffers)
(,(substitute-command-keys "Switch to buffer(s) in other window \\<helm-buffer-switcher-map>`\\[helm-buffer-switch-other-window]'")
. helm-buffer-switch-buffers-other-window)
(,(substitute-command-keys "Switch to buffer in other frame \\<helm-buffer-switcher-map>`\\[helm-buffer-switch-other-frame]'")
. switch-to-buffer-other-frame)
(,(substitute-command-keys "Kill buffer(s) \\<helm-buffer-switcher-map>`\\[helm-buffer-run-kill-buffers]'")
. helm-kill-marked-buffers))
:keymap helm-buffer-switcher-map
:persistent-action 'helm-buffers-list-persistent-action)
(helm-build-dummy-source ,(format "Open new %s" name)
:action (helm-make-actions ,(format "Open new %s" name) ',new-fn)))
:buffer ,(format "*helm-%s-buffers*" name)))))
(provide 'patch-helm)