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)))
;; Emoji fonts
(+with-message "Adding emoji fonts"
(let ((ffl (font-family-list)))
(dolist (font '("Noto Color Emoji"
"Noto Emoji"
"Segoe UI Emoji"
"Apple Color Emoji"
"FreeSans"
"FreeMono"
"FreeSerif"
"Unifont"
"Symbola"))
(when (member font ffl)
(message "Found font: %s" font)
(set-fontset-font t 'symbol (font-spec :family font) nil :append))))))
(+ensure-after-init
(lambda ()
(+with-message "Adding emoji fonts"
(let ((ffl (font-family-list)))
(dolist (font '("Noto Color Emoji"
"Noto Emoji"
"Segoe UI Emoji"
"Apple Color Emoji"
"FreeSans"
"FreeMono"
"FreeSerif"
"Unifont"
"Symbola"))
(when (member font ffl)
(message "Found font: %s" font)
(set-fontset-font t 'symbol
(font-spec :family font) nil :append))))))))
;;; Packages

12
init.el
View File

@ -179,11 +179,11 @@
(cond ((executable-find "mpv") #'+browse-image-with-mpv)
(t #'eww-browse-url))
args)))
(cons (rx
(or "youtube.com" "youtu.be" "yewtu.be"
;; videos
(cons (rx (or ;; videos
"youtube.com" "youtu.be" "yewtu.be" "invidious"
(seq "." (or "mp4" "gif" "mov" "MOV" "webm") eos)
;; music
"soundcloud.com" "bandcamp.com"
(seq "." (or "ogg" "mp3") eos)))
(lambda (&rest args)
(apply (if (executable-find "mpv")
@ -459,6 +459,8 @@
org-outline-path-complete-in-steps nil
org-pretty-entities t
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-special-ctrl-a/e t
org-special-ctrl-k t
@ -556,7 +558,7 @@
org-export-with-sub-superscripts t
org-export-with-toc nil)
(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
(: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-db-directory (elfeed/ "db/" t))
(:+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
(:bind "&" #'+elfeed-search-browse-generic)
(:hook #'hl-line-mode)

View File

@ -25,7 +25,8 @@ that the latter is deprecated in Emacs 28+."
(viewer default-args &optional (prompt "URL: ")
&key
(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.
Also create a `customize' setting in CUSTOM-GROUP for VIEWER's
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
`browse-url-interactive-arg'. The resulting function will be
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))
`(progn
(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)
:type '(repeat :tag "Command-line argument" string)
:group ',custom-group)
(defun ,(intern name) (url &optional _new-window)
(defun ,(intern name) (url &optional new-window)
,(format "Open URL in %s." viewer)
(interactive (browse-url-interactive-arg ,prompt))
(let* ((url (browse-url-encode-url url))
(process-environment (browse-url-process-environment)))
(message ,(format "Opening %%s in %s..." viewer) url)
(apply #'start-process
(concat ,viewer " " url) nil
,viewer
(append ,(intern (format "%s-args" name)) (list url)))))))
(unless (ignore-errors
(apply #'start-process
(concat ,viewer " " url) nil
,viewer
(append ,(intern (format "%s-args" name))
(list url))))
(funcall fallback url new-window))))))
;; Reference implementation: mpv
(+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."
(concat (or spacer +modeline-default-spacer)
(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)
(buffer-name))
'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'.
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)
"Save current buffer in visited file if modified.
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'."
(interactive '(called-interactively))
(message "Saving the buffer...")
(with-demoted-errors (run-hooks 'user-save-hook))
(message "User-Saving the buffer...")
(user-save-run-hooks)
(save-buffer arg)
(message "Saving the buffer...Done."))
(message "User-Saving the buffer...Done."))
(defun user-save-some-buffers (&optional pred)
"Save some buffers as though the user saved them.