* Emacs Open Work
** PROJECT [#B] Fix Dupre Theme
Here are some ideas for making dupre-theme a bit more “complete” and future-proof as an Emacs theme. You don’t have to do all of them, of course, but most “modern” themes ship a fair number of these extra faces and integrations.
*** TODO [#A] Fill out the “standard” Emacs faces
• error / warning / success
• link / link-visited / shadow
• highlight / secondary-selection
• tooltip / tooltip-selection / tooltip-tip
• underline / strike-through
• match / search / lazy-highlight (you already have some isearch)
• info-title-1…info-title-5, info-header-node, help-*-face
*** TODO [#A] Cosmetic / code-style notes
• Factor out a helper macro to reduce repetition:
#+begin_src elisp
(defmacro dupre-face (face &rest specs)
`(,face ((t ,specs))))
#+end_src
• Use =custom-theme-set-faces= only once; wrap your =when (>= emacs-major-version…)= inside it rather than nesting top-level.
• Move your ERT tests into a separate file like =dupre-theme-test.el= so that the main theme file stays lean.
*** TODO [#A] Fix launch problem with dupre
**** cj [2025-08-16 23:45:50]
[[file:.emacs.d/themes/dupre-theme.el::;;; dupre-theme.el --- A dark and elegant theme for Emacs -*- lexical-binding: t -*-][dupre-theme.el]]
I have an issue launching "emacsclient -c -a ''" with this theme. With the built-in wombat theme, emacsclient launches fine. When I specify this theme to load during launch, emacsclient does not launch.
Here is what I see in the terminal when launching:
[25-08-16 23:44:44] cjennings velox:~ [1]
% emacsclient -c -a ''
emacsclient: can't find socket; have you started the server?
emacsclient: To start the server in Emacs, type "M-x server-start".
#+begin_src shell
Warning: due to a long standing Gtk+ bug
https://gitlab.gnome.org/GNOME/gtk/issues/221
Emacs might crash when run in daemon mode and the X11 connection is unexpectedly lost.
Using an Emacs configured with --with-x-toolkit=lucid does not have this problem.
.emacs.d/elpa/hydra-0.15.0/hydra.el: Warning: ‘defadvice’ is an obsolete macro (as of 30.1); use ‘advice-add’ or ‘define-advice’
Loading delsel (native compiled elisp)...
Loading delsel (native compiled elisp)...done
[yas] Prepared just-in-time loading of snippets successfully.
Starting new Ispell process aspell with en_US dictionary... \
Starting new Ispell process aspell with en_US dictionary...done
Starting Emacs daemon.
Emacs daemon should have started, trying to connect again
Waiting for Emacs...
[25-08-16 23:44:56] cjennings velox:~
% sudo killall emacs
#+end_src
Is there something about how this theme is written that may be causing this? If it's unlikely, how would you recommend I diagnose this problem?
**** ChatGPT: o4-mini [2025-08-16 23:51:03]
It turns out that nothing mystical is happening in your =dupre-theme.el= that would prevent the Emacs server from creating its socket. When =emacsclient= says:
emacsclient: can't find socket; have you started the server?
it really does mean “there is no running Emacs –daemon laying down =<…>/server/= for me to talk to.” By itself, loading a custom theme (even one with a few Unicode ellipses or =display-graphic-p= branches) will not stop the server socket from being created. What is much more often the culprit is:
1. Mis-using =emacsclient -a ''= so that it never actually starts the server, or
2. Having a startup error in your init file (or theme) that aborts =server-start= before the socket ever gets written.
Here is how I’d go about diagnosing (and fixing) the situation:
1) Make sure you can start Emacs –daemon cleanly, /without/ any of your custom code.
From a shell, run
emacs --daemon --debug-init --eval "(message \"daemon ok\")"
– you should see a process stick around, and if you look at =~/.emacs.d/server/= you should find a valid socket file.
If that does not happen, Emacs itself is aborting in your init. Remove or comment out your calls to =load-theme=, your theme-specific code, all your =custom-set-…= blocks, and any other ELisp until you can get a clean daemon start. Once that is rock-solid, re-introduce your theme.
2) Once you can start the daemon by hand, verify that =emacsclient -c= can actually talk to it:
emacsclient -c -n
The =-n= is “don’t wait for the client buffer to finish,” so you’ll get your GUI frame immediately. If that works, the server is up and your sockets are good.
3) If you /really/ want =emacsclient -c -a ''= to both start Emacs –daemon /and/ immediately pop a graphical frame, you have two choices:
• Let =-a= fall back to =emacs --daemon=. On many platforms simply omitting the =-a= will do this.
• Explicitly tell it:
emacsclient -c -a "emacs --daemon" # note the command in quotes
On macOS/Homebrew, for instance, people often do
alias ec='emacsclient -c -a "emacs --daemon"'
so that if there is no server, emacsclient will shell out to =emacs --daemon=, launch it, and /then/ connect.
4) If you still suspect your theme is triggering a startup error (and killing the daemon before it gets to =(server-start)=), you can sprinkle a tiny bit of ELisp into your init:
#+begin_src elisp
;; very early in ~/.emacs or init.el
(setq debug-on-error t)
(add-hook 'after-init-hook
(lambda ()
(message "finished init; about to (server-start)")))
(require 'server)
(unless (server-running-p)
(server-start))
#+end_src
Then run:
emacs --daemon --debug-init
and watch =~/.emacs.d/server/server= get created or watch the =*Messages*= buffer or your =~/.emacs.d/emacs-debug.log= (if you redirect =--debug-init= output). If there is a hard error in your theme, you will get a backtrace in your =*Backtrace*= buffer.
5) Finally, a sanity check for your theme file. Launch Emacs /without/ your init:
emacs -Q
Then:
M-x load-file RET /path/to/dupre-theme.el RET
M-x load-theme RET dupre RET
If this produces any errors or warnings in =*Messages*= or =*Warnings*=, you have your smoking gun.
---
Summary
-------
• *The theme itself isn’t going to silently block server-socket creation.*
• *You almost certainly have either:*
– A mis-invocation of =emacsclient -a ''= so that it never starts Emacs –daemon.
– A genuine startup error in your init or in the theme that kills Emacs before =(server-start)= runs.
• *Use*
emacs --daemon --debug-init
plus removing chunks of your init until you find the offending form.
• *Test your theme in a vanilla Emacs (=-Q=)* to see any compile/load errors.
Once you have a clean =emacs --daemon= up and running you will find that
emacsclient -c # or with your favorite fallback: -a "emacs --daemon"
just works, whether you are on wombat, solarized, or good old dupre.
*** TODO [#B] Make sure you define a “minimum package” set of faces so that folks don’t see glaring unstyled text in any part of Emacs, even if they never install extra packages.
*** TODO [#B] Improve terminal support:
• Detect true-color (=(display-graphic-p)=) vs 256-color vs 16-color and fall-back gracefully.
• Provide “256-color” approximations (you already do this), but you might want a simpler palette for legacy terminals.
*** TODO [#B] Other Packages
The rest is just more of the same—pick the most common modes/packages you and your users rely on and give them a quick coat of paint. Once you’ve rounded out those faces you’ll have hit what most people expect from a “complete” modern Emacs theme.
Based on a quick skim of your modules/ directory (and the packages they pull in via use-package), here’s a non-exhaustive list of the major packages you’re using—along with the faces you should think about adding to dupre-theme so that nothing ends up looking “unstyled.”
1. completion/mini-frameworks
• vertico (vertico-current, vertico-group-title, vertico-separator, vertico-doc)
• orderless (orderless-match-face-0…3)
• consult (consult-preview-line, consult-narrow, consult-region, consult-file)
• marginalia (marginalia-annotation, marginalia-document, marginalia-cache)
• embark (embark-general, embark-heading, embark-target, embark-helpful)
• corfu + cape (corfu-default, corfu-current, corfu-bar, cape-file, cape-keyword etc.)
• company (company-tooltip, company-tooltip-selection, company-scrollbar-thumb)
2. ivy/counsel/swiper (if you ever load them side-by-side)
• ivy-current-match, ivy-minibuffer-match-face-1…4
• counsel-outline, swiper-match-face-1…
3. syntax checkers & LSP
• flycheck (flycheck-error, flycheck-warning, flycheck-info)
• eglot or lsp-mode (lsp-face-highlight-textual, lsp-face-highlight-read, lsp-face-semantic-type-…)
• tree-sitter (tree-sitter-hl-face:function, :variable, :property, …)
4. git & diffs
• magit (magit-section, magit-section-title, magit-hunk-heading, magit-branch, magit-log)
• diff-hl / git-gutter (diff-hl-face-insert, diff-hl-face-delete, git-gutter:added, git-gutter:deleted)
• diff-mode (diff-added, diff-removed, diff-context, diff-file-header)
5. project management & navigation
• projectile (projectile-project-name, projectile-project-root)
• treemacs (treemacs-root-face, treemacs-directory-face, treemacs-file-face)
6. Org-mode
• org-document-title, org-level-1…org-level-8
• org-checkbox, org-todo, org-done, org-warning, org-date, org-code, org-block
• plus any “pretty” add-ons you use (org-bullets, org-modern, etc.)
7. Hydra / which-key / key-help
• which-key (which-key-key-face, which-key-group-description-face, which-key-local-map-description-face)
• hydra (hydra-face-red, hydra-face-blue, hydra-face-teal, hydra-face-amaranth)
8. visual helpers
• rainbow-delimiters-depth-1…9
• highlight-indent-guides-odd/even
• highlight-parentheses-/
• beacon (beacon), whitespace (whitespace-space, whitespace-tab, whitespace-newline)
• display-line-numbers (line-number, line-number-current-line—you already have these)
9. UI polishers
• all-the-icons (all-the-icons-blue, all-the-icons-red, …) on modeline or treemacs
• doom-modeline (doom-modeline-bar, doom-modeline-buffer-path)
• fancy-splash/dashboard-faces if you use a startup screen
10. terminals & shells
• vterm (vterm-copy-region-highlight)
• ansi-colors (ansi-color-face-bold, ansi-color-face-italic, ansi-color-[0…7])
To figure out exactly which ones you have in your modules, you can do for example:
#+begin_src elisp
;; from your ~/.emacs.d
(let (pkgs)
(dolist (f (directory-files "~/.emacs.d/modules" t "\\.el$"))
(with-temp-buffer
(insert-file-contents f)
(goto-char (point-min))
(while (re-search-forward "use-package +\\([^ ]+\\)" nil t)
(push (intern (match-string 1)) pkgs))))
(delete-dups pkgs))
#+end_src
Then for each of those packages, grep in their repo for =defface= or check their manual to see which faces they define, and add reasonable dupre-colours for them. Once you’ve covered that list, you’ll have a “complete” theme that won’t leave any of your modules half-unstyled.
*** TODO [#C] Support the built-in “tab-bar” and “tab-group” faces (Emacs 27+)
• tab-bar / tab-bar-tab / tab-bar-tab-inactive
• tab-bar-close / tab-bar-separator
• tab-group-title / tab-group-separator
*** TODO [#C] Add faces for =dired=, =diff=, =flycheck=/=flymake=, =magit= (or git-gutter),
=ediff=, =erc= etc. For example:
• diff-added, diff-removed, diff-context, diff-file-header
• flycheck-error, flycheck-warning, flycheck-info
• magit-section, magit-log, magit-hunk-heading, magit-branch, etc.
*** TODO [#C] Org-mode
• org-level-1…org-level-8, org-document-title
• org-checkbox, org-code, org-date, org-todo, org-done, org-warning
• org-block, org-block-begin-line, org-block-end-line
*** TODO [#C] Completion frameworks & minibuffer enhancements
• ivy-current-match / ivy-minibuffer-match-face-1…4
• swiper-line-face
• vertico-current / marginalia-…
• corfu-default / corfu-bar / cape / orderless-match-face-…
*** TODO [#C] LSP / tree-sitter / syntax-aware faces
• lsp-face-highlight-textual, lsp-face-highlight-read, etc.
• tree-sitter-hl-face:variable, :function, :property, etc.
*** TODO [#C] Which-Key, Hydras, rainbow-delimiters, etc.
• which-key-key-face, which-key-local-map-description-face
• hydra-face-red / teal / blue
• rainbow-delimiters-depth-1…9
*** TODO [#C] Theme Metadata & Packaging
• Add =;; Package-Requires: ((emacs "26.1"))= if you need a minimum.
• Consider adding a README with screenshots.
• A simple Makefile or script to refresh “theme metadata” (=M-x theme-inspect=, MELPA recipe).
*** TODO [#C] Tests
• Extend your ERT suite to cover more faces (org, diff, flycheck…).
• You might write a small helper that loops over a list of faces and asserts they’re defined without errors.
*** Example Sample Faces
Below is a small excerpt showing how you might start adding some of the “missing” standard faces and a couple org faces:
#+begin_src elisp
(custom-theme-set-faces
'dupre
;; … your existing faces …
;; standard global faces
`(error ((t (:foreground ,dupre-intense-red :weight bold))))
`(warning ((t (:foreground ,dupre-yellow+1 :weight bold))))
`(success ((t (:foreground ,dupre-green+1 :weight bold))))
`(link ((t (:foreground ,dupre-blue+1 :underline t))))
`(shadow ((t (:foreground ,dupre-gray))))
`(highlight ((t (:background ,dupre-bg+1))))
`(tooltip ((t (:foreground ,dupre-fg :background ,dupre-bg+2))))
`(tooltip-selection ((t (:background ,dupre-bg+0))))
;; Org-mode sample
`(org-document-title ((t (:foreground ,dupre-yellow+2 :weight bold :height 1.2))))
`(org-level-1 ((t (:foreground ,dupre-blue+2 :weight bold))))
`(org-level-2 ((t (:foreground ,dupre-green+1))))
`(org-checkbox ((t (:foreground ,dupre-yellow :weight bold))))
`(org-todo ((t (:foreground ,dupre-red :weight bold))))
`(org-done ((t (:foreground ,dupre-green+2 :weight bold))))
)
#+end_src
** PROJECT [#A] Reconfigure ai-config.el
*** DONE Rewire commands to use base keybinding of C-c g, which is currently unused.
CLOSED: [2025-08-13 Wed 16:45]
*** DONE Toggle gptel's side window with C-c g t
CLOSED: [2025-08-13 Wed 16:45]
*** DONE Erase the Chatgpt Buffer Altogether With C-c g e
CLOSED: [2025-08-13 Wed 16:45]
*** DONE AI Assistant's Answers Should Be Underneath a Labeled Org Heading
CLOSED: [2025-08-13 Wed 16:46]
**** The time should also be a component of the org heading
**** Reference
modified from: https://github.com/gregoryg/emacs-gregoryg?tab=readme-ov-file#return-gptel-backend--model
(defun cj/gptel-backend-and-model ()
"Return gptel backend and model (if any)."
(let ((backend (if (boundp 'gptel-backend) (aref gptel-backend 1)))
(model (if (boundp 'gptel-model) gptel-model)))
(format "(%s %s)" backend model)))
(defun cj/gptel-insert-model-in-non-gptel-buffers ()
"This function will add the backend and model in the \"dynamic\" buffers, not in dedicated chat buffers.
To be used in `gptel-pre-response-hook'."
(unless (member 'gptel-mode local-minor-modes)
(goto-char (point-max))
(insert (format "\n%s: " (cj/gptel-backend-and-model)))
(goto-char (point-max))))
(add-hook 'gptel-pre-response-hook 'cj/gptel-insert-model-in-non-gptel-buffers)
(defun cj/gptel-insert-model-in-chat-buffers (response-begin-pos response-end-pos)
"This function adds the backend and model in dedicated chat buffers.
Can be used with the `gptel-post-response-functions' hook."
(let* ((gptel-org-prefix (alist-get 'org-mode gptel-prompt-prefix-alist))
(inserted-string (format "%s %s\n"
(substring gptel-org-prefix 0 (string-match " " gptel-org-prefix))
(cj/gptel-backend-and-model)))
(len-inserted (length inserted-string )))
(goto-char response-begin-pos)
(insert inserted-string)
(goto-char (+ response-end-pos len-inserted))))
(add-hook 'gptel-post-response-functions 'cj/gptel-insert-model-in-chat-buffers)
*** TODO Use C-c g to copy the current selection into the ChatGPT buffer, starting one if one doesn't exist
*** TODO Change the Prompt: C-c g p
*** TODO Change the Directive: C-c g d
*** TODO Default should be coding
** PROJECT [#A] Work on mu4e email
*** TODO [#A] mu4e contacts not expanding on forwarding emails
*** TODO [#A] Fix org-contacts functionality
*** TODO [#A] Add org-msg
https://github.com/jeremy-compostella/org-msg
** PROJECT [#B] Org Agenda Work
*** TODO [#B] Add Past Due to F8 Agenda Summary in Emacs
*** TODO [#B] Separate B and C in F8 Agenda Summary in Emacs
** PROJECT [#B] Org Roam and Org Template Fixes
*** TODO [#B] Fix Emacs Org Roam Recipe Error
C-c n i then type a recipe name.
org-element--get-category: Invalid function: org-element-with-disabled-cache
The file was created, but does not come to the front
The category value seems unaligned
*** TODO [#A] Add Org Templates Back to Emacs Repository!
*** TODO [#B] Add Org Capture Template for Vocabulary Words
** TODO [#B] Dirvish should open not showing hidden files by default
*** 2025-06-07 Sat @ 12:25:28 -0500 It isn't omitting the h switch on directory listings
No. Didn't help
** TODO [#B] Fix Emacs Alarms for Scheduled Events
*** 2025-06-03 Tue @ 15:12:51 -0500 Problem
Emacs Alarm seems to sound off periodically after the alarm rang the first time.
It should ring once at the beginning of the event, and that's it.
*** 2025-06-28 Sat @ 12:42:19 -0500 User's Method for Alarms In Emacs
This is more than I actually want, but leaving here for reference.
#+BEGIN_QUOTE
I am quite happy with the system I use, which does (I think) exactly what you want. It has two parts: an Emacs part that uses appt.el to schedule the reminders and a small shell program (I'm using Linux) that creates the popup + sound notification. Here I share the code for both parts.
A) Code in ~/.emacs.d/init.el
(require 'appt)
(appt-activate t)
(setq appt-message-warning-time 5) ; Show notification 5 minutes before event
(setq appt-display-interval appt-message-warning-time) ; Disable multiple reminders
(setq appt-display-mode-line nil)
; Use appointment data from org-mode
(defun my-org-agenda-to-appt ()
(interactive)
(setq appt-time-msg-list nil)
(org-agenda-to-appt))
; Update alarms when...
; (1) ... Starting Emacs
(my-org-agenda-to-appt)
; (2) ... Everyday at 12:05am (useful in case you keep Emacs always on)
(run-at-time "12:05am" (* 24 3600) 'my-org-agenda-to-appt)
; (3) ... When TODO.txt is saved
(add-hook 'after-save-hook
'(lambda ()
(if (string= (buffer-file-name) (concat (getenv "HOME") "/ideas/TODO.txt"))
(my-org-agenda-to-appt))))
; Display appointments as a window manager notification
(setq appt-disp-window-function 'my-appt-display)
(setq appt-delete-window-function (lambda () t))
(setq my-appt-notification-app (concat (getenv "HOME") "/bin/appt-notification"))
(defun my-appt-display (min-to-app new-time msg)
(if (atom min-to-app)
(start-process "my-appt-notification-app" nil my-appt-notification-app min-to-app msg)
(dolist (i (number-sequence 0 (1- (length min-to-app))))
(start-process "my-appt-notification-app" nil my-appt-notification-app (nth i min-to-app) (nth i msg)))))
B) Code in ~/bin/appt-notification
#!/bin/sh
TIME="$1"
MSG="$2"
notify-send -t 0 "
Appointment in $TIME minutes:
$MSG
"
play "~/bin/alarm.wav"
To get voice notifications you could replace the last line (play) with the following:
espeak "Appointment in $TIME minutes: $MSG"
#+END_QUOTE
[[https://emacs.stackexchange.com/questions/3844/good-methods-for-setting-up-alarms-audio-visual-triggered-by-org-mode-events][Good methods for setting up alarms (audio + visual) triggered by org-mode events? - Emacs Stack Exchange]]
Captured On: [2025-06-19 Thu 12:29]
** TODO [#C] Revisit and refactor localrepo functionality
** TODO [#C] Check and test native comp logging changes
** TODO [#C] Emacs: Should adding tasks add it to Projects and Tasks in the inbox file?
** TODO [#C] Fix exporting documents to HTML.
This appears to work with emacs -q. What's up with your config?
** TODO [#C] Rename 'sync-dir' Variable in Init File to 'org-dir'
[[https://github.com/ryuslash/mode-icons][ryuslash/mode-icons: Show icons instead of mode names]]
Captured On: [2025-06-07 Sat 13:29]
** TODO [#D] Install ZOxide Integration into Emacs
[[https://gitlab.com/Vonfry/zoxide.el][Vonfry / zoxide.el · GitLab]]
Captured On: [2025-06-07 Sat 17:11]
** TODO [#D] manateelazycat/awesome-tray: Hide mode-line, display necessary information at right of minibuffer.
[[https://github.com/manateelazycat/awesome-tray][manateelazycat/awesome-tray: Hide mode-line, display necessary information at right of minibuffer.]]
Captured On: [2025-06-07 Sat 13:29]
** TODO [#D] ryuslash/mode-icons: Show icons instead of mode names
** TODO [#D] Emacs Signal Client
*** TODO investigate: net/signel.org · master · undefined · GitLab
[[https://gitlab.com/jaor/elibs/-/blob/master/net/signel.org][net/signel.org · master · undefined · GitLab]]
Captured On: [2025-05-29 Thu 04:24]
*** TODO investigate: signel, a barebones signal chat on top of signal-cli
[[https://jao.io/blog/signel.html][signel, a barebones signal chat on top of signal-cli]]
Captured On: [2025-05-29 Thu 04:23]
* Emacs Project Ideas/References
** emacs-tw/awesome-elisp: 🏵️ A curated list of Emacs Lisp development resources
[[https://github.com/emacs-tw/awesome-elisp][emacs-tw/awesome-elisp: 🏵️ A curated list of Emacs Lisp development resources]]
Captured On: [2025-06-07 Sat 13:42]
** emacs-tw/awesome-emacs: A community driven list of useful Emacs packages, libraries and other items.
[[https://github.com/emacs-tw/awesome-emacs#layout][emacs-tw/awesome-emacs: A community driven list of useful Emacs packages, libraries and other items.]]
Captured On: [2025-06-07 Sat 13:30]
** bastibe/org-static-blog: A static site generator using org-mode
[[https://github.com/bastibe/org-static-blog][bastibe/org-static-blog: A static site generator using org-mode]]
Captured On: [2025-05-29 Thu 04:32]
** an emacs packages hat trick
[[https://jao.io/blog/emacs-packages-hat-trick.html][an emacs packages hat trick]]
Captured On: [2025-05-29 Thu 04:28]
** a high signal to noise emacs command: buffer-same-mode
[[https://jao.io/blog/high-signal-to-noise-emacs-command.html][a high signal to noise emacs command]]
Captured On: [2025-05-29 Thu 04:33]
** How I batch apply and save one-liners
[[https://xenodium.com/how-i-batch-apply-and-save-one-liners][How I batch apply and save one-liners]]
Captured On: [2025-08-01 Fri 03:11]
** Better org-mode Agenda display-buffer-alist Settings • Christian Tietze
[[https://christiantietze.de/posts/2022/12/updated-org-mode-agenda-display-buffer-alist/][Better org-mode Agenda display-buffer-alist Settings • Christian Tietze]]
Captured On: [2025-08-01 Fri 03:21]
** GitHub - xenodium/dwim-shell-command: Save your shell commands/scripts and apply from Emacs with ease.
[[https://github.com/xenodium/dwim-shell-command][GitHub - xenodium/dwim-shell-command: Save your shell commands/scripts and apply from Emacs with ease.]]
Captured On: [2025-08-01 Fri 03:10]
** GitHub - hyakt/emacs-dashboard-hackernews: Display a topstories of Hacker News on Dashboard.
[[https://github.com/hyakt/emacs-dashboard-hackernews][GitHub - hyakt/emacs-dashboard-hackernews: Display a topstories of Hacker News on Dashboard.]]
Captured On: [2025-08-01 Fri 02:47]
** org mode - org-link to the exact page-position in a pdf file - Emacs Stack Exchange
[[https://emacs.stackexchange.com/questions/68013/org-link-to-the-exact-page-position-in-a-pdf-file][org mode - org-link to the exact page-position in a pdf file - Emacs Stack Exchange]]
Captured On: [2025-07-11 Fri 18:17]