David Bowie
This commit is contained in:
parent
6ffc1e7e42
commit
4b2e57e396
|
@ -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
12
init.el
|
@ -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)
|
||||||
|
|
|
@ -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: ")
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
|
@ -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
|
|
@ -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)
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue