Start using elfeed
This commit is contained in:
parent
9ab46d8189
commit
f07783e561
229
config.org
229
config.org
|
@ -617,13 +617,15 @@ issues when started in a non-graphical session.
|
|||
(defun greedily-do-daemon-setup ()
|
||||
(when (daemonp)
|
||||
(require 'org)
|
||||
(require 'mu4e)
|
||||
(setq mu4e-confirm-quit t)
|
||||
(setq mu4e-lock-greedy t)
|
||||
(setq mu4e-lock-relaxed t)
|
||||
(mu4e-lock-add-watcher)
|
||||
(when (mu4e-lock-avalible t)
|
||||
(mu4e~start))))
|
||||
(when (require 'mu4e nil t)
|
||||
(setq mu4e-confirm-quit t)
|
||||
(setq mu4e-lock-greedy t)
|
||||
(setq mu4e-lock-relaxed t)
|
||||
(mu4e-lock-add-watcher)
|
||||
(when (mu4e-lock-avalible t)
|
||||
(mu4e~start)))
|
||||
(when (require 'elfeed nil t)
|
||||
(run-at-time nil (* 8 60 60) #'elfeed-update))))
|
||||
|
||||
(add-hook 'emacs-startup-hook #'greedily-do-daemon-setup)
|
||||
#+END_SRC
|
||||
|
@ -1379,6 +1381,219 @@ Now, some actual emojis to use.
|
|||
#+BEGIN_SRC emacs-lisp
|
||||
(setq elcord-use-major-mode-as-main-icon t)
|
||||
#+END_SRC
|
||||
** Elfeed
|
||||
RSS feeds are still a thing. Why not make use of them.
|
||||
I really like what [[https://github.com/fuxialexander/doom-emacs-private-xfu/tree/master/modules/app/rss][fuxialexander]] has going on, but I don't think I need a custom
|
||||
module. Let's just try to patch on the main things I like the look of.
|
||||
*** Keybindings
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(map! :map elfeed-search-mode-map
|
||||
:after elfeed-search
|
||||
[remap kill-this-buffer] "q"
|
||||
[remap kill-buffer] "q"
|
||||
:n doom-leader-key nil
|
||||
:n "q" #'+rss/quit
|
||||
:n "e" #'elfeed-update
|
||||
:n "r" #'elfeed-search-untag-all-unread
|
||||
:n "u" #'elfeed-search-tag-all-unread
|
||||
:n "s" #'elfeed-search-live-filter
|
||||
:n "RET" #'elfeed-search-show-entry
|
||||
:n "p" #'elfeed-show-pdf
|
||||
:n "+" #'elfeed-search-tag-all
|
||||
:n "-" #'elfeed-search-untag-all
|
||||
:n "S" #'elfeed-search-set-filter
|
||||
:n "b" #'elfeed-search-browse-url
|
||||
:n "y" #'elfeed-search-yank)
|
||||
(map! :map elfeed-show-mode-map
|
||||
:after elfeed-show
|
||||
[remap kill-this-buffer] "q"
|
||||
[remap kill-buffer] "q"
|
||||
:n doom-leader-key nil
|
||||
:nm "q" #'+rss/delete-pane
|
||||
:nm "o" #'ace-link-elfeed
|
||||
:nm "RET" #'org-ref-elfeed-add
|
||||
:nm "n" #'elfeed-show-next
|
||||
:nm "N" #'elfeed-show-prev
|
||||
:nm "p" #'elfeed-show-pdf
|
||||
:nm "+" #'elfeed-show-tag
|
||||
:nm "-" #'elfeed-show-untag
|
||||
:nm "s" #'elfeed-show-new-live-search
|
||||
:nm "y" #'elfeed-show-yank)
|
||||
#+END_SRC
|
||||
*** Usability enhancements
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(after! elfeed-search
|
||||
(set-evil-initial-state! 'elfeed-search-mode 'normal))
|
||||
(after! elfeed-show-mode
|
||||
(set-evil-initial-state! 'elfeed-show-mode 'normal))
|
||||
|
||||
(after! evil-snipe
|
||||
(push 'elfeed-show-mode evil-snipe-disabled-modes)
|
||||
(push 'elfeed-search-mode evil-snipe-disabled-modes))
|
||||
#+END_SRC
|
||||
*** Visual enhancements
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(after! elfeed
|
||||
|
||||
(elfeed-org)
|
||||
(use-package! elfeed-link)
|
||||
|
||||
(setq elfeed-search-filter "@1-week-ago +unread"
|
||||
elfeed-search-print-entry-function '+rss/elfeed-search-print-entry
|
||||
elfeed-search-title-min-width 80
|
||||
elfeed-show-entry-switch #'pop-to-buffer
|
||||
elfeed-show-entry-delete #'+rss/delete-pane
|
||||
elfeed-show-refresh-function #'+rss/elfeed-show-refresh--better-style
|
||||
shr-max-image-proportion 0.6)
|
||||
|
||||
(add-hook! 'elfeed-show-mode-hook (hide-mode-line-mode 1))
|
||||
(add-hook! 'elfeed-search-update-hook #'hide-mode-line-mode)
|
||||
|
||||
(defface elfeed-show-title-face '((t (:weight ultrabold :slant italic :height 1.5)))
|
||||
"title face in elfeed show buffer"
|
||||
:group 'elfeed)
|
||||
(defface elfeed-show-author-face `((t (:weight light)))
|
||||
"title face in elfeed show buffer"
|
||||
:group 'elfeed)
|
||||
(set-face-attribute 'elfeed-search-title-face nil
|
||||
:foreground 'nil
|
||||
:weight 'light)
|
||||
|
||||
(defadvice! +rss-elfeed-wrap-h-nicer ()
|
||||
"Enhances an elfeed entry's readability by wrapping it to a width of
|
||||
`fill-column' and centering it with `visual-fill-column-mode'."
|
||||
:override #'+rss-elfeed-wrap-h
|
||||
(let ((inhibit-read-only t)
|
||||
(inhibit-modification-hooks t))
|
||||
(setq-local truncate-lines nil)
|
||||
(setq-local shr-width 120)
|
||||
(setq-local line-spacing 0.2)
|
||||
(setq-local visual-fill-column-center-text t)
|
||||
(visual-fill-column-mode)
|
||||
;; (setq-local shr-current-font '(:family "Merriweather" :height 1.2))
|
||||
(set-buffer-modified-p nil)))
|
||||
|
||||
(defun +rss/elfeed-search-print-entry (entry)
|
||||
"Print ENTRY to the buffer."
|
||||
(let* ((elfeed-goodies/tag-column-width 40)
|
||||
(elfeed-goodies/feed-source-column-width 30)
|
||||
(title (or (elfeed-meta entry :title) (elfeed-entry-title entry) ""))
|
||||
(title-faces (elfeed-search--faces (elfeed-entry-tags entry)))
|
||||
(feed (elfeed-entry-feed entry))
|
||||
(feed-title
|
||||
(when feed
|
||||
(or (elfeed-meta feed :title) (elfeed-feed-title feed))))
|
||||
(tags (mapcar #'symbol-name (elfeed-entry-tags entry)))
|
||||
(tags-str (concat (mapconcat 'identity tags ",")))
|
||||
(title-width (- (window-width) elfeed-goodies/feed-source-column-width
|
||||
elfeed-goodies/tag-column-width 4))
|
||||
|
||||
(tag-column (elfeed-format-column
|
||||
tags-str (elfeed-clamp (length tags-str)
|
||||
elfeed-goodies/tag-column-width
|
||||
elfeed-goodies/tag-column-width)
|
||||
:left))
|
||||
(feed-column (elfeed-format-column
|
||||
feed-title (elfeed-clamp elfeed-goodies/feed-source-column-width
|
||||
elfeed-goodies/feed-source-column-width
|
||||
elfeed-goodies/feed-source-column-width)
|
||||
:left)))
|
||||
|
||||
(insert (propertize feed-column 'face 'elfeed-search-feed-face) " ")
|
||||
(insert (propertize tag-column 'face 'elfeed-search-tag-face) " ")
|
||||
(insert (propertize title 'face title-faces 'kbd-help title))
|
||||
(setq-local line-spacing 0.2)))
|
||||
|
||||
(defun +rss/elfeed-show-refresh--better-style ()
|
||||
"Update the buffer to match the selected entry, using a mail-style."
|
||||
(interactive)
|
||||
(let* ((inhibit-read-only t)
|
||||
(title (elfeed-entry-title elfeed-show-entry))
|
||||
(date (seconds-to-time (elfeed-entry-date elfeed-show-entry)))
|
||||
(author (elfeed-meta elfeed-show-entry :author))
|
||||
(link (elfeed-entry-link elfeed-show-entry))
|
||||
(tags (elfeed-entry-tags elfeed-show-entry))
|
||||
(tagsstr (mapconcat #'symbol-name tags ", "))
|
||||
(nicedate (format-time-string "%a, %e %b %Y %T %Z" date))
|
||||
(content (elfeed-deref (elfeed-entry-content elfeed-show-entry)))
|
||||
(type (elfeed-entry-content-type elfeed-show-entry))
|
||||
(feed (elfeed-entry-feed elfeed-show-entry))
|
||||
(feed-title (elfeed-feed-title feed))
|
||||
(base (and feed (elfeed-compute-base (elfeed-feed-url feed)))))
|
||||
(erase-buffer)
|
||||
(insert "\n")
|
||||
(insert (format "%s\n\n" (propertize title 'face 'elfeed-show-title-face)))
|
||||
(insert (format "%s\t" (propertize feed-title 'face 'elfeed-search-feed-face)))
|
||||
(when (and author elfeed-show-entry-author)
|
||||
(insert (format "%s\n" (propertize author 'face 'elfeed-show-author-face))))
|
||||
(insert (format "%s\n\n" (propertize nicedate 'face 'elfeed-log-date-face)))
|
||||
(when tags
|
||||
(insert (format "%s\n"
|
||||
(propertize tagsstr 'face 'elfeed-search-tag-face))))
|
||||
;; (insert (propertize "Link: " 'face 'message-header-name))
|
||||
;; (elfeed-insert-link link link)
|
||||
;; (insert "\n")
|
||||
(cl-loop for enclosure in (elfeed-entry-enclosures elfeed-show-entry)
|
||||
do (insert (propertize "Enclosure: " 'face 'message-header-name))
|
||||
do (elfeed-insert-link (car enclosure))
|
||||
do (insert "\n"))
|
||||
(insert "\n")
|
||||
(if content
|
||||
(if (eq type 'html)
|
||||
(elfeed-insert-html content base)
|
||||
(insert content))
|
||||
(insert (propertize "(empty)\n" 'face 'italic)))
|
||||
(goto-char (point-min))))
|
||||
|
||||
)
|
||||
#+END_SRC
|
||||
*** Functionality enhancements
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(after! elfeed-show
|
||||
(require 'url)
|
||||
|
||||
(defvar elfeed-pdf-dir
|
||||
(expand-file-name "pdfs/"
|
||||
(file-name-directory (directory-file-name elfeed-enclosure-default-dir))))
|
||||
|
||||
(defvar elfeed-link-pdfs
|
||||
'(("https://www.jstatsoft.org/index.php/jss/article/view/v0\\([^/]+\\)" . "https://www.jstatsoft.org/index.php/jss/article/view/v0\\1/v\\1.pdf")
|
||||
("http://arxiv.org/abs/\\([^/]+\\)" . "https://arxiv.org/pdf/\\1.pdf"))
|
||||
"List of alists of the form (REGEX-FOR-LINK . FORM-FOR-PDF)")
|
||||
|
||||
(defun elfeed-show-pdf (entry)
|
||||
(interactive
|
||||
(list (or elfeed-show-entry (elfeed-search-selected :ignore-region))))
|
||||
(let ((link (elfeed-entry-link entry))
|
||||
(feed-name (plist-get (elfeed-feed-meta (elfeed-entry-feed entry)) :title))
|
||||
(title (elfeed-entry-title entry))
|
||||
(file-view-function
|
||||
(lambda (f)
|
||||
(when elfeed-show-entry
|
||||
(elfeed-kill-buffer))
|
||||
(pop-to-buffer (find-file-noselect f))))
|
||||
pdf)
|
||||
|
||||
(let ((file (expand-file-name
|
||||
(concat (subst-char-in-string ?/ ?, title) ".pdf")
|
||||
(expand-file-name (subst-char-in-string ?/ ?, feed-name)
|
||||
elfeed-pdf-dir))))
|
||||
(if (file-exists-p file)
|
||||
(funcall file-view-function file)
|
||||
(dolist (link-pdf elfeed-link-pdfs)
|
||||
(when (and (string-match-p (car link-pdf) link)
|
||||
(not pdf))
|
||||
(setq pdf (replace-regexp-in-string (car link-pdf) (cdr link-pdf) link))))
|
||||
(if (not pdf)
|
||||
(message "No associated PDF for entry")
|
||||
(message "Fetching %s" pdf)
|
||||
(unless (file-exists-p (file-name-directory file))
|
||||
(make-directory (file-name-directory file) t))
|
||||
(url-copy-file pdf file)
|
||||
(funcall file-view-function file))))))
|
||||
|
||||
)
|
||||
#+END_SRC
|
||||
** [[https://github.com/zachcurry/emacs-anywhere][Emacs Anywhere]] configuration
|
||||
To start with, let's install this.
|
||||
#+BEGIN_SRC shell :tangle (if (executable-find "emacs_anywhere") "no" "setup.sh")
|
||||
|
|
Loading…
Reference in New Issue