Helm: Use helm-source-buffer in helm-deflister

master
Pierre Neidhardt 2019-03-03 11:38:06 +01:00
parent de0483cde9
commit 6f63408a16
1 changed files with 42 additions and 42 deletions

View File

@ -1,54 +1,55 @@
(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))
(defun ambrevar/helm-source-buffer-not-found (&optional mode new-fn)
"See `helm-source-buffer-not-found'."
(helm-build-dummy-source
"Create buffer"
:action `(("Create buffer (C-u choose mode)" .
(lambda (candidate)
(if (not ,new-fn)
(let ((mjm (or (and helm-current-prefix-arg
(intern-soft (helm-comp-read
"Major-mode: "
helm-buffers-favorite-modes)))
,mode
(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))
(switch-to-buffer (funcall ,new-fn candidate))))))))
(defmacro helm-deflister (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)
,@extra-sources
(helm-build-dummy-source ,(format "Open new %s" name)
:action (helm-make-actions
,(format "Open new %s" name) ',new-fn
,(format "Open new %s in new window" name)
(lambda (args)
(let ((buffer (save-window-excursion (funcall ,new-fn args))))
(switch-to-buffer-other-window buffer))))))
:buffer ,(format "*helm-%s-buffers*" name)))))
(helm
:sources
(list (helm-make-source ,(format "%s buffers" name) 'helm-source-buffers
:buffer-list (lambda ()
(cl-loop for b in (buffer-list)
when (funcall ,predicate b)
collect (buffer-name b))))
,@(let ((mode (intern (format "%s-mode" (downcase name)))))
(when (fboundp mode)
`(ambrevar/helm-source-buffer-not-found
,mode
,new-fn))))
:buffer ,(format "*helm-%s-buffers*" name)))))
(defmacro helm-defswitcher (name predicate new-fn &optional extra-sources)
"Create an interactive Eshell buffer.
Switch to last Eshell session if any.
"Create an interactive buffer switcher for NAME.
When current buffer is not of NAME, switch to last NAME 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)))))
If current buffer is of NAME, show the buffer list."
(let ((switch (intern (format "helm-%s-switch" (downcase name)))))
`(progn
(helm-deflister ,name ,predicate ,new-fn ,extra-sources)
(defun ,(intern (format "helm-%s-switch" (downcase name))) (&optional menu other-window)
(defun ,switch (&optional menu other-window)
(interactive "P")
(if (or menu (derived-mode-p ',mode))
(if (or menu (funcall ,predicate (current-buffer)))
;; 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)
@ -58,10 +59,9 @@ See `eshell' for the numeric prefix ARG."
(if (get-buffer-window last)
(select-window (get-buffer-window last))
(funcall (if other-window 'switch-to-buffer-other-window 'switch-to-buffer) last))
(funcall ,new-fn)))))
(funcall ',new-fn)))))
(defun ,(intern (format "helm-%s-switch-other-window" (downcase name))) (&optional menu)
(interactive "P")
(funcall ',(intern (format "helm-%s-switch" (downcase name)))
menu 'other-window)))))
(funcall ',switch menu 'other-window)))))
(provide 'patch-helm)