From cc29c3717334a7f7820ec3c57548a10fceee1e75 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Tue, 22 Mar 2022 21:57:48 +0300 Subject: [PATCH] feat: open sections --- elfeed-summary.el | 60 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/elfeed-summary.el b/elfeed-summary.el index e6895d8..e88b3a8 100644 --- a/elfeed-summary.el +++ b/elfeed-summary.el @@ -605,23 +605,24 @@ The return value is a list of alists of the following elements: (defvar elfeed-summary-mode-map (let ((map (make-sparse-keymap))) (set-keymap-parent map magit-section-mode-map) - (define-key map (kbd "RET") #'widget-button-press) - (define-key map (kbd "M-RET") #'elfeed-summary--widget-press-show-read) + (define-key map (kbd "RET") #'elfeed-summary--action) + (define-key map (kbd "M-RET") #'elfeed-summary--action-show-read) (define-key map (kbd "q") (lambda () (interactive) (quit-window t))) (define-key map (kbd "r") #'elfeed-summary--refresh) (define-key map (kbd "R") #'elfeed-update) (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*) (evil-define-key* 'normal map (kbd "") #'magit-section-toggle "r" #'elfeed-summary--refresh "R" #'elfeed-update "u" #'elfeed-summary-toggle-only-unread - "U" #'elfeed-summary--widget-press-mark-read - "M-RET" #'elfeed-summary--widget-press-show-read + (kbd "RET") #'elfeed-summary--action + "M-RET" #'elfeed-summary--action-show-read + "U" #'elfeed-summary--action-mark-read "q" (lambda () (interactive) (quit-window t)))) @@ -690,10 +691,48 @@ items." WIDGET is an instance of the pressed widget." (cond (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 (widget-get widget :feed) (widget-get widget :only-read))))) +(defun elfeed-summary--group-extract-feeds (group) + "Extract feeds from GROUP. + +GROUP is a `' 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) "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)) (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. 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 `' 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) (slot-boundp section 'group)) (puthash (alist-get 'params (oref section group)) - (oref section hidden) + (or parent-hidden (oref section hidden)) folding-state)) (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) (defun elfeed-summary--restore-folding-state (folding-state &optional section)