David Bowie

This commit is contained in:
Case Duckworth 2022-01-14 17:20:23 -06:00
parent 6ffc1e7e42
commit 4b2e57e396
7 changed files with 108 additions and 86 deletions

View File

@ -90,20 +90,23 @@ See `no-littering' for examples.")
:height variable-font-size))) :height variable-font-size)))
;; Emoji fonts ;; Emoji fonts
(+with-message "Adding emoji fonts" (+ensure-after-init
(let ((ffl (font-family-list))) (lambda ()
(dolist (font '("Noto Color Emoji" (+with-message "Adding emoji fonts"
"Noto Emoji" (let ((ffl (font-family-list)))
"Segoe UI Emoji" (dolist (font '("Noto Color Emoji"
"Apple Color Emoji" "Noto Emoji"
"FreeSans" "Segoe UI Emoji"
"FreeMono" "Apple Color Emoji"
"FreeSerif" "FreeSans"
"Unifont" "FreeMono"
"Symbola")) "FreeSerif"
(when (member font ffl) "Unifont"
(message "Found font: %s" font) "Symbola"))
(set-fontset-font t 'symbol (font-spec :family font) nil :append)))))) (when (member font ffl)
(message "Found font: %s" font)
(set-fontset-font t 'symbol
(font-spec :family font) nil :append))))))))
;;; Packages ;;; Packages

12
init.el
View File

@ -179,11 +179,11 @@
(cond ((executable-find "mpv") #'+browse-image-with-mpv) (cond ((executable-find "mpv") #'+browse-image-with-mpv)
(t #'eww-browse-url)) (t #'eww-browse-url))
args))) args)))
(cons (rx (cons (rx (or ;; videos
(or "youtube.com" "youtu.be" "yewtu.be" "youtube.com" "youtu.be" "yewtu.be" "invidious"
;; videos
(seq "." (or "mp4" "gif" "mov" "MOV" "webm") eos) (seq "." (or "mp4" "gif" "mov" "MOV" "webm") eos)
;; music ;; music
"soundcloud.com" "bandcamp.com"
(seq "." (or "ogg" "mp3") eos))) (seq "." (or "ogg" "mp3") eos)))
(lambda (&rest args) (lambda (&rest args)
(apply (if (executable-find "mpv") (apply (if (executable-find "mpv")
@ -459,6 +459,8 @@
org-outline-path-complete-in-steps nil org-outline-path-complete-in-steps nil
org-pretty-entities t org-pretty-entities t
org-pretty-entities-include-sub-superscripts nil org-pretty-entities-include-sub-superscripts nil
org-refile-targets '((nil . (:maxlevel . 2))
(org-agenda-files . (:maxlevel . 1)))
org-refile-use-outline-path 'file org-refile-use-outline-path 'file
org-special-ctrl-a/e t org-special-ctrl-a/e t
org-special-ctrl-k t org-special-ctrl-k t
@ -556,7 +558,7 @@
org-export-with-sub-superscripts t org-export-with-sub-superscripts t
org-export-with-toc nil) org-export-with-toc nil)
(with-eval-after-load 'user-save (with-eval-after-load 'user-save
(add-hook 'org-export-before-processing-hook #'user-save-buffer))) (advice-add 'org-export-dispatch :before 'user-save-run-hooks)))
(setup prog (setup prog
(:local-set comment-auto-fill-only-comments t) (:local-set comment-auto-fill-only-comments t)
@ -996,7 +998,7 @@ See also `crux-reopen-as-root-mode'."
elfeed-show-unique-buffers t elfeed-show-unique-buffers t
elfeed-db-directory (elfeed/ "db/" t)) elfeed-db-directory (elfeed/ "db/" t))
(:+key "C-x w" #'elfeed) (:+key "C-x w" #'elfeed)
(advice-add #'elfeed-search-fetch :after #'beginning of buffer) (advice-add #'elfeed-search-fetch :after #'beginning-of-buffer)
(:with-mode elfeed-search-mode (:with-mode elfeed-search-mode
(:bind "&" #'+elfeed-search-browse-generic) (:bind "&" #'+elfeed-search-browse-generic)
(:hook #'hl-line-mode) (:hook #'hl-line-mode)

View File

@ -25,7 +25,8 @@ that the latter is deprecated in Emacs 28+."
(viewer default-args &optional (prompt "URL: ") (viewer default-args &optional (prompt "URL: ")
&key &key
(custom-group '+browse-url) (custom-group '+browse-url)
(name (format "+browse-url-with-%s" viewer))) (name (format "+browse-url-with-%s" viewer))
(fallback #'browse-url-generic))
"Create a `browse-url' handler function that calls VIEWER on the url. "Create a `browse-url' handler function that calls VIEWER on the url.
Also create a `customize' setting in CUSTOM-GROUP for VIEWER's Also create a `customize' setting in CUSTOM-GROUP for VIEWER's
arguments. DEFAULT-ARGS specifies the default arguments that arguments. DEFAULT-ARGS specifies the default arguments that
@ -33,7 +34,10 @@ setting should have. PROMPT will be shown to user in the
function's `interactive' spec, as an argument to function's `interactive' spec, as an argument to
`browse-url-interactive-arg'. The resulting function will be `browse-url-interactive-arg'. The resulting function will be
named NAME, defaulting to \"+browse-url-with-VIEWER\", and the variable named NAME, defaulting to \"+browse-url-with-VIEWER\", and the variable
\"NAME-args\"." \"NAME-args\".
If FALLBACK is non-nil, it's a function to fallback on if the
`start-process' call fails in anyway."
(declare (indent 1)) (declare (indent 1))
`(progn `(progn
(defcustom ,(intern (format "%s-args" name)) (defcustom ,(intern (format "%s-args" name))
@ -41,16 +45,19 @@ named NAME, defaulting to \"+browse-url-with-VIEWER\", and the variable
,(format "Arguments to pass to %s in `%s'." viewer name) ,(format "Arguments to pass to %s in `%s'." viewer name)
:type '(repeat :tag "Command-line argument" string) :type '(repeat :tag "Command-line argument" string)
:group ',custom-group) :group ',custom-group)
(defun ,(intern name) (url &optional _new-window) (defun ,(intern name) (url &optional new-window)
,(format "Open URL in %s." viewer) ,(format "Open URL in %s." viewer)
(interactive (browse-url-interactive-arg ,prompt)) (interactive (browse-url-interactive-arg ,prompt))
(let* ((url (browse-url-encode-url url)) (let* ((url (browse-url-encode-url url))
(process-environment (browse-url-process-environment))) (process-environment (browse-url-process-environment)))
(message ,(format "Opening %%s in %s..." viewer) url) (message ,(format "Opening %%s in %s..." viewer) url)
(apply #'start-process (unless (ignore-errors
(concat ,viewer " " url) nil (apply #'start-process
,viewer (concat ,viewer " " url) nil
(append ,(intern (format "%s-args" name)) (list url))))))) ,viewer
(append ,(intern (format "%s-args" name))
(list url))))
(funcall fallback url new-window))))))
;; Reference implementation: mpv ;; Reference implementation: mpv
(+browse-url-make-external-viewer-handler "mpv" nil "Video URL: ") (+browse-url-make-external-viewer-handler "mpv" nil "Video URL: ")

View File

@ -61,7 +61,9 @@ This function makes a lambda, so you can throw it straight into
"Display the buffer name." "Display the buffer name."
(concat (or spacer +modeline-default-spacer) (concat (or spacer +modeline-default-spacer)
(propertize (propertize
(+string-align (buffer-name) 20 :ellipsis nil) (truncate-string-to-width (buffer-name)
(min 24 (/ (window-width) 3))
nil ?\ t)
'help-echo (or (buffer-file-name) 'help-echo (or (buffer-file-name)
(buffer-name)) (buffer-name))
'mouse-face 'mode-line-highlight))) 'mouse-face 'mode-line-highlight)))

58
lisp/elephant.el Normal file
View File

@ -0,0 +1,58 @@
;;; elephant.el --- Remember variables and modes -*- lexical-binding: t; -*-
;;; Code:
(defmacro elephant-remember (alist)
"Setup a closure remembering symbols to apply with
`remember-reset'. The variables will be renamed using TEMPLATE.
ALIST contains cells of the form (SYMBOL . NEW-VALUE), where
SYMBOL is a variable or mode name, and its value is what to set
after `remember-set'."
(unless lexical-binding
(user-error "`elephant' requires lexical binding."))
(let* ((template (format "elephant--%s-%%s" (gensym)))
(reset-fn (intern (format template "reset"))))
(cl-destructuring-bind (let-list fn-set-list fn-reset-list)
(cl-loop
for (sym . val) in (if (symbolp alist) (symbol-value alist) alist)
as rem = (intern (format template sym))
collect (list rem sym)
into let-list
collect (cond ((eq val 'enable)
`(,sym +1))
((eq val 'disable)
`(,sym -1))
(t `(setq-local ,sym ,val)))
into fn-set-list
collect (cond ((memq val '(enable disable))
`(progn (,sym (if ,rem +1 -1))
(fmakunbound ',rem)))
(t `(progn (setq-local ,sym ,rem)
(makunbound ',rem))))
into fn-reset-list
finally return (list let-list
fn-set-list
fn-reset-list))
`(progn
(defvar-local ,reset-fn nil
"Function to recall values from `elephant-remember'.")
(let ,let-list
(setf (symbol-function ',reset-fn)
(lambda ()
,@fn-reset-list
(redraw-display)
(fmakunbound ',reset-fn))))
,@fn-set-list
',reset-fn))))
(defun elephant-forget ()
"Forget all symbols generated by `elephant-remember'."
)
(provide 'elephant)
;;; elephant.el ends here

View File

@ -1,56 +0,0 @@
;;; remember.el --- Remember variables and modes -*- lexical-binding: t; -*-
;;; Code:
(defmacro remember-remember (alist)
(let* ((template (format "remember--%s-%%s" (gensym)))
(reset-fn (intern (format template "recall")))
(things (cl-loop for (sym . newval) in alist
as rem = (intern (format template sym))
;; Collect original values
)))))
(defmacro remember-set (&rest symbols)
"Setup a closure remembering symbols to apply with
`remember-reset'. The variables will be renamed using TEMPLATE.
SYMBOLS is a plist: the properties are symbols or mode names, and
their values what to set after `remember-setup'."
(let* ((template (format "remember--%s-%%s" (gensym)))
(reset-fn (intern (format template "reset")))
(list (cl-loop for sym in symbols by #'cddr
collect `(,(intern (format template sym))
,sym)
into let-list
collect (let ((val (plist-get symbols sym)))
(cond ((eq val 'enable)
`(,sym +1))
((eq val 'disable)
`(,sym -1))
(t `(setq-local ,sym ,val))))
into fn-set-list
collect (let ((val (plist-get symbols sym))
(rem (intern (format template sym))))
(cond ((memq val '(enable disable))
`(,sym (if ,rem +1 -1)))
(t `(setq-local ,sym ,rem))))
into fn-reset-list
finally return (list let-list
fn-reset-list
fn-set-list))))
`(progn
(defvar-local ,reset-fn nil
"Function to recall values from `remember-set'.")
(let ,(cl-first list)
(setf (symbol-function ',reset-fn)
(lambda ()
,@(cl-second list))))
,@(cl-third list)
',reset-fn)))
;; test
(set 'fn (remember-set display-fill-column-indicator-mode disable))
(funcall fn)

View File

@ -28,6 +28,12 @@ Emacs is killed."
"Keymap for `user-save-mode'. "Keymap for `user-save-mode'.
This map shadows the default map for `save-buffer'.") This map shadows the default map for `save-buffer'.")
(defun user-save-run-hooks (&rest _)
"Run the hooks in `user-save-hook'.
This does /not/ also save the buffer."
(with-demoted-errors "User-save-hook error: %S"
(run-hooks 'user-save-hook)))
(defun user-save-buffer (&optional arg) (defun user-save-buffer (&optional arg)
"Save current buffer in visited file if modified. "Save current buffer in visited file if modified.
This function is precisely the same as `save-buffer', but with This function is precisely the same as `save-buffer', but with
@ -40,10 +46,10 @@ run all the time, put them in `user-save-hook'.
ARG is passed directly to `save-buffer'." ARG is passed directly to `save-buffer'."
(interactive '(called-interactively)) (interactive '(called-interactively))
(message "Saving the buffer...") (message "User-Saving the buffer...")
(with-demoted-errors (run-hooks 'user-save-hook)) (user-save-run-hooks)
(save-buffer arg) (save-buffer arg)
(message "Saving the buffer...Done.")) (message "User-Saving the buffer...Done."))
(defun user-save-some-buffers (&optional pred) (defun user-save-some-buffers (&optional pred)
"Save some buffers as though the user saved them. "Save some buffers as though the user saved them.