feat: open sections

This commit is contained in:
Pavel Korytov 2022-03-22 21:57:48 +03:00
parent 78b5eea4b5
commit cc29c37173

View file

@ -605,23 +605,24 @@ The return value is a list of alists of the following elements:
(defvar elfeed-summary-mode-map (defvar elfeed-summary-mode-map
(let ((map (make-sparse-keymap))) (let ((map (make-sparse-keymap)))
(set-keymap-parent map magit-section-mode-map) (set-keymap-parent map magit-section-mode-map)
(define-key map (kbd "RET") #'widget-button-press) (define-key map (kbd "RET") #'elfeed-summary--action)
(define-key map (kbd "M-RET") #'elfeed-summary--widget-press-show-read) (define-key map (kbd "M-RET") #'elfeed-summary--action-show-read)
(define-key map (kbd "q") (lambda () (define-key map (kbd "q") (lambda ()
(interactive) (interactive)
(quit-window t))) (quit-window t)))
(define-key map (kbd "r") #'elfeed-summary--refresh) (define-key map (kbd "r") #'elfeed-summary--refresh)
(define-key map (kbd "R") #'elfeed-update) (define-key map (kbd "R") #'elfeed-update)
(define-key map (kbd "u") #'elfeed-summary-toggle-only-unread) (define-key map (kbd "u") #'elfeed-summary-toggle-only-unread)
(define-key map (kbd "U") #'elfeed-summary--widget-press-mark-read) (define-key map (kbd "U") #'elfeed-summary--action-mark-read)
(when (fboundp #'evil-define-key*) (when (fboundp #'evil-define-key*)
(evil-define-key* 'normal map (evil-define-key* 'normal map
(kbd "<tab>") #'magit-section-toggle (kbd "<tab>") #'magit-section-toggle
"r" #'elfeed-summary--refresh "r" #'elfeed-summary--refresh
"R" #'elfeed-update "R" #'elfeed-update
"u" #'elfeed-summary-toggle-only-unread "u" #'elfeed-summary-toggle-only-unread
"U" #'elfeed-summary--widget-press-mark-read (kbd "RET") #'elfeed-summary--action
"M-RET" #'elfeed-summary--widget-press-show-read "M-RET" #'elfeed-summary--action-show-read
"U" #'elfeed-summary--action-mark-read
"q" (lambda () "q" (lambda ()
(interactive) (interactive)
(quit-window t)))) (quit-window t))))
@ -690,10 +691,48 @@ items."
WIDGET is an instance of the pressed widget." WIDGET is an instance of the pressed widget."
(cond (cond
(elfeed-summary--search-mark-read (elfeed-summary--search-mark-read
(elfeed-summary--mark-read (widget-get widget :feed))) (elfeed-summary--mark-read (list (widget-get widget :feed))))
(_ (elfeed-summary--goto-feed (_ (elfeed-summary--goto-feed
(widget-get widget :feed) (widget-get widget :only-read))))) (widget-get widget :feed) (widget-get widget :only-read)))))
(defun elfeed-summary--group-extract-feeds (group)
"Extract feeds from GROUP.
GROUP is a `<tree-group-params>' as described in
`elfeed-summary--get-data'."
(cl-loop for child in (alist-get 'children group)
if (eq (car child) 'group)
append (elfeed-summary--group-extract-feeds child)
else if (eq (car child) 'feed)
collect (alist-get 'feed (cdr child))))
(defun elfeed-summary--open-section (section)
"Open section under cursor.
SECTION is an instance of `magit-section'."
(let ((feeds (elfeed-summary--group-extract-feeds
(oref section group))))
(unless feeds
(user-error "No feeds in section!"))
(cond
(elfeed-summary--search-mark-read
(elfeed-summary--mark-read feeds))
(t (progn
(elfeed)
(elfeed-search-set-filter
(concat
elfeed-summary-default-filter
(unless elfeed-summary--search-show-read
"+unread ")
(mapconcat
(lambda (feed)
(format "=%s" (replace-regexp-in-string
(rx "?" (* not-newline) eos)
""
(elfeed-feed-url feed))))
feeds
" "))))))))
(defun elfeed-summary--render-feed (data) (defun elfeed-summary--render-feed (data)
"Render a feed item for the elfeed summary buffer. "Render a feed item for the elfeed summary buffer.
@ -853,11 +892,11 @@ TREE is a form such as returned by `elfeed-summary--get-data'."
(mapc #'elfeed-summary--render-item tree)) (mapc #'elfeed-summary--render-item tree))
(widget-setup))) (widget-setup)))
(defun elfeed-summary--get-folding-state (&optional section folding-state) (defun elfeed-summary--get-folding-state (&optional section folding-state parent-hidden)
"Get the folding state of elfeed summary groups. "Get the folding state of elfeed summary groups.
SECTION is an instance of `magit-section', FOLDING-STATE is a hash SECTION is an instance of `magit-section', FOLDING-STATE is a hash
map. Both parameters are used for recursive descent. map. PARENT-HIDDEN shows whether the parent section is hidden.
If SECTION has the `group' slot, it is presumed to hold an instance of If SECTION has the `group' slot, it is presumed to hold an instance of
`<tree-group-params>' as described in `elfeed-summary--get-data'. The `<tree-group-params>' as described in `elfeed-summary--get-data'. The
@ -870,10 +909,11 @@ the corresponding `hidden' slots as values."
(when (and (slot-exists-p section 'group) (when (and (slot-exists-p section 'group)
(slot-boundp section 'group)) (slot-boundp section 'group))
(puthash (alist-get 'params (oref section group)) (puthash (alist-get 'params (oref section group))
(oref section hidden) (or parent-hidden (oref section hidden))
folding-state)) folding-state))
(cl-loop for child in (oref section children) (cl-loop for child in (oref section children)
do (elfeed-summary--get-folding-state child folding-state)) do (elfeed-summary--get-folding-state
child folding-state (oref section hidden)))
folding-state) folding-state)
(defun elfeed-summary--restore-folding-state (folding-state &optional section) (defun elfeed-summary--restore-folding-state (folding-state &optional section)