mirror of
https://github.com/SqrtMinusOne/elfeed-summary.git
synced 2025-12-11 18:13:03 +03:00
feat: open sections
This commit is contained in:
parent
78b5eea4b5
commit
cc29c37173
1 changed files with 50 additions and 10 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue