2019-02-22 17:55:23 +01:00
|
|
|
(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))
|
|
|
|
|
2019-02-22 18:26:57 +01:00
|
|
|
(defmacro helm-deflister (name predicate new-fn &optional extra-sources)
|
2019-02-22 17:55:23 +01:00
|
|
|
(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)
|
2019-02-22 18:26:57 +01:00
|
|
|
,@extra-sources
|
2019-02-22 17:55:23 +01:00
|
|
|
(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)))))
|
|
|
|
|
2019-02-22 18:26:57 +01:00
|
|
|
(defmacro helm-defswitcher (name predicate new-fn &optional extra-sources)
|
|
|
|
"Create an interactive Eshell buffer.
|
|
|
|
Switch to last Eshell session if any.
|
|
|
|
Otherwise create a new one and switch to it.
|
|
|
|
See `eshell' for the numeric prefix ARG."
|
|
|
|
(let ((mode (intern (format "%s-mode" (downcase name)))))
|
|
|
|
`(progn
|
|
|
|
(helm-deflister ,name ,predicate ,new-fn ,extra-sources)
|
|
|
|
(defun ,(intern (format "helm-%s-switch" (downcase name))) (&rest arg)
|
|
|
|
(interactive "P")
|
|
|
|
(if (or arg (derived-mode-p ',mode))
|
|
|
|
;; TODO: Funcall the return value of helm-deflister.
|
|
|
|
(funcall ',(intern (format "helm-%s-buffers" (downcase name))))
|
|
|
|
(let ((last (cl-loop for buffer in (buffer-list)
|
|
|
|
when (funcall ,predicate buffer)
|
|
|
|
return buffer)))
|
|
|
|
(if last
|
|
|
|
(switch-to-buffer last)
|
|
|
|
(funcall ,new-fn))))))))
|
2019-02-22 17:55:23 +01:00
|
|
|
|
|
|
|
(provide 'patch-helm)
|