Helm: Refine helm-defswitcher macro

master
Pierre Neidhardt 2019-02-22 18:26:57 +01:00
parent 7027282244
commit dd3ed544f1
2 changed files with 24 additions and 21 deletions

View File

@ -264,27 +264,10 @@ This should be faster then `seq-uniq'."
(lambda (b)
(with-current-buffer b
(derived-mode-p 'eshell-mode)))
(lambda (name)
(lambda (&optional name)
(eshell 'new)
(rename-buffer (format "*eshell<%s>*" name) 'unique)))
(defun ambrevar/eshell-or-new-session (&optional arg)
"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."
(interactive "P")
(if (or arg (eq major-mode 'eshell-mode))
(helm-eshell-buffers)
;; (eshell (or arg t))
(let ((last (buffer-list)))
(while (and last
(not (with-current-buffer (car last)
(eq major-mode 'eshell-mode))))
(setq last (cdr last)))
(if last
(switch-to-buffer (car last))
(eshell (or arg t))))))
(when name
(rename-buffer (format "*eshell<%s>*" name) 'unique))))
;;; Auto-suggestion
(when (require 'esh-autosuggest nil t)

View File

@ -10,7 +10,7 @@
(defun helm-buffer-transformer (buffers)
(mapcar #'buffer-name buffers))
(defmacro helm-defswitcher (name predicate new-fn &optional extra-sources)
(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))) ()
@ -28,9 +28,29 @@
. 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)))
: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.
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))))))))
(provide 'patch-helm)