Helm: Use helm-source-buffer in helm-deflister
parent
de0483cde9
commit
6f63408a16
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue