From 677fb44922b10fbf0acdff70924dad2fdc16a7a8 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Wed, 10 Mar 2021 13:34:24 -0600 Subject: [PATCH] Making leader work as override and bongo elfeed mixing --- README.org | 151 +++++++++++++++++++++++++++++++++++++++++------------ init.el | 151 +++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 236 insertions(+), 66 deletions(-) diff --git a/README.org b/README.org index 3df9be50..bd821367 100644 --- a/README.org +++ b/README.org @@ -272,30 +272,32 @@ This evil-collection package includes a lot of other evil based things. :keymaps '(normal visual emacs) :prefix "SPC") (chris/leader-keys - "b" '(:ignore t :which-key "buffer") - "t" '(:ignore t :which-key "toggle") - "f" '(:ignore t :which-key "file") - "w" '(:ignore t :which-key "window") - "s" '(:ignore t :which-key "search") - "o" '(:ignore t :which-key "open") - "h" '(:ignore t :which-key "help") - "n" '(:ignore t :which-key "notes") - "bs" '(consult-buffer :which-key "buffer search") - "bd" '(kill-this-buffer :which-key "kill buffer") - "bi" '(ibuffer :which-key "ibuffer") - "tt" '(consult-theme :which-key "choose theme") - "ff" '(find-file :which-key "find file") - "fb" '((find-file ~/org/bibles/) :which-key "find bible book") - "fr" '(consult-recent-file :which-key "recent file") - "fs" '(save-buffer :which-key "save") - "hf" '(helpful-callable :which-key "describe-function") - "hv" '(helpful-variable :which-key "describe-variable") - "hk" '(helpful-key :which-key "describe-key") - "hi" '(info :which-key "info manual") - "ss" '(consult-line :which-key "consult search") - "ww" '(other-window :which-key "other window") - "wd" '(delete-window :which-key "other window") - ) + :states 'normal + :keymaps 'override + "b" '(:ignore t :which-key "buffer") + "t" '(:ignore t :which-key "toggle") + "f" '(:ignore t :which-key "file") + "w" '(:ignore t :which-key "window") + "s" '(:ignore t :which-key "search") + "o" '(:ignore t :which-key "open") + "h" '(:ignore t :which-key "help") + "n" '(:ignore t :which-key "notes") + "bs" '(consult-buffer :which-key "buffer search") + "bd" '(kill-this-buffer :which-key "kill buffer") + "bi" '(ibuffer :which-key "ibuffer") + "tt" '(consult-theme :which-key "choose theme") + "ff" '(find-file :which-key "find file") + "fb" '((find-file ~/org/bibles/) :which-key "find bible book") + "fr" '(consult-recent-file :which-key "recent file") + "fs" '(save-buffer :which-key "save") + "hf" '(helpful-callable :which-key "describe-function") + "hv" '(helpful-variable :which-key "describe-variable") + "hk" '(helpful-key :which-key "describe-key") + "hi" '(info :which-key "info manual") + "ss" '(consult-line :which-key "consult search") + "ww" '(other-window :which-key "other window") + "wd" '(delete-window :which-key "other window") + ) (general-def 'minibuffer-local-map "C-v" 'evil-paste-after)) #+end_src @@ -463,6 +465,8 @@ Consult has a lot of nice functions like Ivy's Counsel functions (enhanced searc (setq consult-narrow-key "<") :general (chris/leader-keys + :states 'normal + :keymaps 'override "si" 'consult-imenu "so" 'consult-outline)) #+end_src @@ -538,6 +542,8 @@ I do a lot of docker management so having yaml is necessary :straight nil :general (chris/leader-keys + :states 'normal + :keymaps 'override "od" '(dired-jump :which-key "open dired here")) (general-def 'normal dired-mode-map "q" 'kill-this-buffer)) @@ -719,6 +725,8 @@ Part of this config includes some special capture templates for my work as a you :general (chris/leader-keys + :states 'normal + :keymaps 'override "o a" 'org-agenda "c" 'org-capture) ('normal org-agenda-mode-map @@ -831,6 +839,8 @@ We also need to setup some capture templates to use some specific setups with my :head "#+TITLE: %<%Y-%m-%d> - Biblical\n#+AUTHOR: Chris Cochrun"))) :general (chris/leader-keys + :states 'normal + :keymaps 'override "nf" '(org-roam-find-file :which-key "org roam ff") "nr" 'org-roam)) @@ -1154,6 +1164,8 @@ If on a: (mu4e t) :general (chris/leader-keys + :states 'normal + :keymaps 'override "om" 'mu4e)) (use-package org-mime @@ -1189,6 +1201,8 @@ Let's add org-msg to write emails in org-mode ))) :general (chris/leader-keys + :states 'normal + :keymaps 'override "oc" 'chris/calfw-calendar-open) (general-def cfw:calendar-mode-map "q" 'kill-this-buffer @@ -1217,7 +1231,10 @@ Use magit, because why wouldn't you? duh! (use-package magit :commands (magit-status magit-get-current-branch) :general - (chris/leader-keys "g g" 'magit-status) + (chris/leader-keys + :states 'normal + :keymaps 'override + "g g" 'magit-status) :custom (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) #+end_src @@ -1307,6 +1324,8 @@ Let's add our own eshell prompt. and set the password cache to a significantly h :general (chris/leader-keys + :states 'normal + :keymaps 'override "oe" 'eshell) (general-def '(normal insert) eshell-mode-map "C-d" 'kill-this-buffer)) @@ -1338,32 +1357,95 @@ Let's use pdf-tools for a lot better interaction with pdfs. '(("\\*e?shell\\*" (display-buffer-in-side-window) (window-width . 0.4) - (side . right)))) + (side . right)) + ("*Bongo-Elfeed Queue*" + (display-buffer-in-side-window) + (window-height . 0.25) + (side . bottom)))) #+end_src ** Elfeed #+begin_src emacs-lisp (use-package elfeed :commands (elfeed) + :config + (defvar chris/elfeed-bongo-playlist "*Bongo-Elfeed Queue*" + "Name of the Elfeed+Bongo multimedia playlist.") + + (defun chris/elfeed-bongo-insert-item () + "Insert `elfeed' multimedia links in `bongo' playlist buffer. + +The playlist buffer has a unique name so that it will never +interfere with the default `bongo-playlist-buffer'." + (interactive) + (let* ((entry (elfeed-search-selected :ignore-region)) + (link (elfeed-entry-link entry)) + (enclosure (elt (car (elfeed-entry-enclosures entry)) 0)) + (url (if (string-prefix-p "https://thumbnails" enclosure) + link + enclosure)) + (title (elfeed-entry-title entry)) + (bongo-pl chris/elfeed-bongo-playlist) + (buffer (get-buffer-create bongo-pl))) + (message "link is %s" link) + (message "enclosure is %s" enclosure) + (message "url is %s" url) + (message "title is %s" title) + (elfeed-search-untag-all-unread) + (unless (bongo-playlist-buffer) + (bongo-playlist-buffer)) + (display-buffer buffer) + (with-current-buffer buffer + (when (not (bongo-playlist-buffer-p)) + (bongo-playlist-mode) + (setq-local bongo-library-buffer (get-buffer "*elfeed-search*")) + (setq-local bongo-enabled-backends '(mpv)) + (bongo-progressive-playback-mode)) + (goto-char (point-max)) + (bongo-insert-uri url (format "%s ==> %s" title url)) + (let ((inhibit-read-only t)) + (delete-duplicate-lines (point-min) (point-max))) + (bongo-recenter)) + (message "Enqueued %s ā€œ%sā€ in %s" + (if enclosure "podcast" "video") + (propertize title 'face 'italic) + (propertize bongo-pl 'face 'bold)))) + + (defun chris/elfeed-bongo-switch-to-playlist () + (interactive) + (let* ((bongo-pl chris/elfeed-bongo-playlist) + (buffer (get-buffer bongo-pl))) + (if buffer + (switch-to-buffer buffer) + (message "No `bongo' playlist is associated with `elfeed'.")))) + + :general (chris/leader-keys - "of" 'elfeed)) + :states 'normal + :keymaps 'override + "of" 'elfeed) + + (general-def 'normal elfeed-search-mode-map + "v" 'chris/elfeed-bongo-insert-item + "h" 'chris/elfeed-bongo-switch-to-playlist)) #+end_src #+begin_src emacs-lisp (use-package elfeed-org :after elfeed :config - (setq rmh-elfeed-org-files (list "~/org/elfeed.org"))) + (setq rmh-elfeed-org-files (list "~/org/elfeed.org")) + (elfeed-org) + (elfeed-update)) #+end_src ** Bongo #+begin_src emacs-lisp (use-package bongo - :commands (bongo) + :commands (bongo bongo-playlist-buffer) :config (define-bongo-backend mpv - ;; :constructor 'bongo-start-mpv-player :program-name 'mpv :constructor 'bongo-start-mpv-player :extra-program-arguments '("--input-ipc-server=/tmp/mpvsocket") @@ -1377,7 +1459,7 @@ Let's use pdf-tools for a lot better interaction with pdfs. :matcher '(("http:" "https:" "lbry:") . t)) (setq bongo-enabled-backends '(mpv) - bongo-track-mark-icon-file-name "sun-solid.png") + bongo-track-mark-icon-file-name "track-mark-icon.png") (defun chris/bongo-mark-line-forward () (interactive) @@ -1391,10 +1473,12 @@ Let's use pdf-tools for a lot better interaction with pdfs. :general (chris/leader-keys + :states 'normal + :keymaps 'override "ob" 'bongo) (general-def 'normal bongo-playlist-mode-map - "RET" 'bongo-dwim - "d" 'bongo-kill + "RET" 'bongo-play + "d" 'bongo-kill-line "u" 'bongo-unmark-region "p" 'bongo-pause/resume "H" 'bongo-switch-buffers @@ -1406,6 +1490,7 @@ Let's use pdf-tools for a lot better interaction with pdfs. We set the =gc-cons-threshold= variable to really high, now lets set it back low to make sure emacs performs properly. #+begin_src emacs-lisp (setq gc-cons-threshold 2000000) +(setq garbage-collection-messages nil) #+end_src * Early Init diff --git a/init.el b/init.el index 414baa26..f6d4cf86 100644 --- a/init.el +++ b/init.el @@ -163,30 +163,32 @@ :keymaps '(normal visual emacs) :prefix "SPC") (chris/leader-keys - "b" '(:ignore t :which-key "buffer") - "t" '(:ignore t :which-key "toggle") - "f" '(:ignore t :which-key "file") - "w" '(:ignore t :which-key "window") - "s" '(:ignore t :which-key "search") - "o" '(:ignore t :which-key "open") - "h" '(:ignore t :which-key "help") - "n" '(:ignore t :which-key "notes") - "bs" '(consult-buffer :which-key "buffer search") - "bd" '(kill-this-buffer :which-key "kill buffer") - "bi" '(ibuffer :which-key "ibuffer") - "tt" '(consult-theme :which-key "choose theme") - "ff" '(find-file :which-key "find file") - "fb" '((find-file ~/org/bibles/) :which-key "find bible book") - "fr" '(consult-recent-file :which-key "recent file") - "fs" '(save-buffer :which-key "save") - "hf" '(helpful-callable :which-key "describe-function") - "hv" '(helpful-variable :which-key "describe-variable") - "hk" '(helpful-key :which-key "describe-key") - "hi" '(info :which-key "info manual") - "ss" '(consult-line :which-key "consult search") - "ww" '(other-window :which-key "other window") - "wd" '(delete-window :which-key "other window") - ) + :states 'normal + :keymaps 'override + "b" '(:ignore t :which-key "buffer") + "t" '(:ignore t :which-key "toggle") + "f" '(:ignore t :which-key "file") + "w" '(:ignore t :which-key "window") + "s" '(:ignore t :which-key "search") + "o" '(:ignore t :which-key "open") + "h" '(:ignore t :which-key "help") + "n" '(:ignore t :which-key "notes") + "bs" '(consult-buffer :which-key "buffer search") + "bd" '(kill-this-buffer :which-key "kill buffer") + "bi" '(ibuffer :which-key "ibuffer") + "tt" '(consult-theme :which-key "choose theme") + "ff" '(find-file :which-key "find file") + "fb" '((find-file ~/org/bibles/) :which-key "find bible book") + "fr" '(consult-recent-file :which-key "recent file") + "fs" '(save-buffer :which-key "save") + "hf" '(helpful-callable :which-key "describe-function") + "hv" '(helpful-variable :which-key "describe-variable") + "hk" '(helpful-key :which-key "describe-key") + "hi" '(info :which-key "info manual") + "ss" '(consult-line :which-key "consult search") + "ww" '(other-window :which-key "other window") + "wd" '(delete-window :which-key "other window") + ) (general-def 'minibuffer-local-map "C-v" 'evil-paste-after)) @@ -267,6 +269,8 @@ vertically." (setq consult-narrow-key "<") :general (chris/leader-keys + :states 'normal + :keymaps 'override "si" 'consult-imenu "so" 'consult-outline)) @@ -312,6 +316,8 @@ vertically." :straight nil :general (chris/leader-keys + :states 'normal + :keymaps 'override "od" '(dired-jump :which-key "open dired here")) (general-def 'normal dired-mode-map "q" 'kill-this-buffer)) @@ -467,6 +473,8 @@ vertically." :general (chris/leader-keys + :states 'normal + :keymaps 'override "o a" 'org-agenda "c" 'org-capture) ('normal org-agenda-mode-map @@ -557,6 +565,8 @@ vertically." :head "#+TITLE: %<%Y-%m-%d> - Biblical\n#+AUTHOR: Chris Cochrun"))) :general (chris/leader-keys + :states 'normal + :keymaps 'override "nf" '(org-roam-find-file :which-key "org roam ff") "nr" 'org-roam)) @@ -866,6 +876,8 @@ If on a: (mu4e t) :general (chris/leader-keys + :states 'normal + :keymaps 'override "om" 'mu4e)) (use-package org-mime @@ -896,6 +908,8 @@ If on a: ))) :general (chris/leader-keys + :states 'normal + :keymaps 'override "oc" 'chris/calfw-calendar-open) (general-def cfw:calendar-mode-map "q" 'kill-this-buffer @@ -912,7 +926,10 @@ If on a: (use-package magit :commands (magit-status magit-get-current-branch) :general - (chris/leader-keys "g g" 'magit-status) + (chris/leader-keys + :states 'normal + :keymaps 'override + "g g" 'magit-status) :custom (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) @@ -998,6 +1015,8 @@ If on a: :general (chris/leader-keys + :states 'normal + :keymaps 'override "oe" 'eshell) (general-def '(normal insert) eshell-mode-map "C-d" 'kill-this-buffer)) @@ -1019,24 +1038,87 @@ If on a: '(("\\*e?shell\\*" (display-buffer-in-side-window) (window-width . 0.4) - (side . right)))) + (side . right)) + ("*Bongo-Elfeed Queue*" + (display-buffer-in-side-window) + (window-height . 0.25) + (side . bottom)))) (use-package elfeed :commands (elfeed) + :config + (defvar chris/elfeed-bongo-playlist "*Bongo-Elfeed Queue*" + "Name of the Elfeed+Bongo multimedia playlist.") + + (defun chris/elfeed-bongo-insert-item () + "Insert `elfeed' multimedia links in `bongo' playlist buffer. + +The playlist buffer has a unique name so that it will never +interfere with the default `bongo-playlist-buffer'." + (interactive) + (let* ((entry (elfeed-search-selected :ignore-region)) + (link (elfeed-entry-link entry)) + (enclosure (elt (car (elfeed-entry-enclosures entry)) 0)) + (url (if (string-prefix-p "https://thumbnails" enclosure) + link + enclosure)) + (title (elfeed-entry-title entry)) + (bongo-pl chris/elfeed-bongo-playlist) + (buffer (get-buffer-create bongo-pl))) + (message "link is %s" link) + (message "enclosure is %s" enclosure) + (message "url is %s" url) + (message "title is %s" title) + (elfeed-search-untag-all-unread) + (unless (bongo-playlist-buffer) + (bongo-playlist-buffer)) + (display-buffer buffer) + (with-current-buffer buffer + (when (not (bongo-playlist-buffer-p)) + (bongo-playlist-mode) + (setq-local bongo-library-buffer (get-buffer "*elfeed-search*")) + (setq-local bongo-enabled-backends '(mpv)) + (bongo-progressive-playback-mode)) + (goto-char (point-max)) + (bongo-insert-uri url (format "%s ==> %s" title url)) + (let ((inhibit-read-only t)) + (delete-duplicate-lines (point-min) (point-max))) + (bongo-recenter)) + (message "Enqueued %s ā€œ%sā€ in %s" + (if enclosure "podcast" "video") + (propertize title 'face 'italic) + (propertize bongo-pl 'face 'bold)))) + + (defun chris/elfeed-bongo-switch-to-playlist () + (interactive) + (let* ((bongo-pl chris/elfeed-bongo-playlist) + (buffer (get-buffer bongo-pl))) + (if buffer + (switch-to-buffer buffer) + (message "No `bongo' playlist is associated with `elfeed'.")))) + + :general (chris/leader-keys - "of" 'elfeed)) + :states 'normal + :keymaps 'override + "of" 'elfeed) + + (general-def 'normal elfeed-search-mode-map + "v" 'chris/elfeed-bongo-insert-item + "h" 'chris/elfeed-bongo-switch-to-playlist)) (use-package elfeed-org :after elfeed :config - (setq rmh-elfeed-org-files (list "~/org/elfeed.org"))) + (setq rmh-elfeed-org-files (list "~/org/elfeed.org")) + (elfeed-org) + (elfeed-update)) (use-package bongo - :commands (bongo) + :commands (bongo bongo-playlist-buffer) :config (define-bongo-backend mpv - ;; :constructor 'bongo-start-mpv-player :program-name 'mpv :constructor 'bongo-start-mpv-player :extra-program-arguments '("--input-ipc-server=/tmp/mpvsocket") @@ -1050,7 +1132,7 @@ If on a: :matcher '(("http:" "https:" "lbry:") . t)) (setq bongo-enabled-backends '(mpv) - bongo-track-mark-icon-file-name "sun-solid.png") + bongo-track-mark-icon-file-name "track-mark-icon.png") (defun chris/bongo-mark-line-forward () (interactive) @@ -1064,13 +1146,16 @@ If on a: :general (chris/leader-keys + :states 'normal + :keymaps 'override "ob" 'bongo) (general-def 'normal bongo-playlist-mode-map - "RET" 'bongo-dwim - "d" 'bongo-kill + "RET" 'bongo-play + "d" 'bongo-kill-line "u" 'bongo-unmark-region "p" 'bongo-pause/resume "H" 'bongo-switch-buffers "m" 'chris/bongo-mark-line-forward)) (setq gc-cons-threshold 2000000) +(setq garbage-collection-messages nil)