summaryrefslogtreecommitdiff
path: root/todo.org
blob: ef00d8393c9eeedc6974df27da6ba7848c61b650 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
* Emacs Open Work
** TODO [#A] Custom Function: Delete Whitespace From Region is Broken  :bug:
** TODO [#A] file-config.el cj/xdg-open blocks Emacs process           :bug:
Should change to non-blocking -- maybe use Emacs internal async?
** TODO [#A] Make org mode buffers swap with shift-meta        :enhancement:
(org-shiftmetaright) should be overridden with  (buf-move-right)
(org-shiftmetaleft) should be overridden with  (buf-move-left)

** TODO [#A] mu4e: Add "save all attachments"                  :enhancement:
- add to action menu for view message buffer
** TODO [#A] Mu4e Fixes                                                :bug:
*** DONE [#A] mu4e contacts not expanding on forwarding emails
CLOSED: [2025-08-29 Fri 16:09]
removed org-contacts functionaality and it returned!
*** DONE [#A] Add org-msg
CLOSED: [2025-08-30 Sat 12:12]
https://github.com/jeremy-compostella/org-msg
*** TODO [#A] Fix org-msg barfing when replying to html file
*** TODO [#A] Fix org-contacts functionality
*** TODO [#B] Fix up action menu
- remove xwidgets
- add "add attachment" to compose message buffer
** DOING [#A] Org Roam Enhancements                            :enhancement:
*** TODO [#B] Org Branch to Org Roam
*** TODO [#B] Add Org Capture Template for Vocabulary Words
** TODO [#B] Ability to switch models easily in GPTel          :enhancement:
** TODO [#B] Add All ERT Tests Into Separate Directory                 :bug:
Tests should be added to a separate directory rather than the end of each elisp file.
Gather them together, move them there, and make it easy to run tests per module and workflow.
** TODO [#B] Add Hugo Blogging Functionality                   :enhancement:
** TODO [#B] Capture and Refile to drill files                 :enhancement:
This code actually exists in org-drill-config, but it doesn't seem to work
** TODO [#B] Change Elfeed to Be About Playing Podcasts        :enhancement:
** TODO [#B] Decent HTML exports from org mode with inline css
*** fniessen/org-html-themes: Org mode files transformed into stunning HTML documents
[[https://github.com/fniessen/org-html-themes?tab=readme-ov-file#using-a-theme][fniessen/org-html-themes: Transform your Org mode files into stunning HTML documents in minutes with our Org mode HTML theme. Elevate your productivity and impress your readers! #orgmode #html #theme #productivity #design]]
Captured On: [2025-08-18 Mon 14:36]
** TODO [#B] Dirvish Should Open Not Showing Hidden Files by Default   :bug:
*** 2025-06-07 Sat @ 12:25:28 -0500 It isn't omitting the h switch on directory listings
No. Didn't help
** TODO [#B] Emacs Add Difftastic Functionality                :enhancement:

Linux Binary Install
https://github.com/Wilfred/difftastic
https://www.wilfred.me.uk/blog/2022/09/06/difftastic-the-fantastic-diff/
https://difftastic.wilfred.me.uk/installation.html (basically $ sudo pacman -S difftastic)

Emacs Package
https://github.com/pkryger/difftastic.el
#+begin_src emacs-lisp
  (use-package difftastic
    :defer t
    :vc (:url "https://github.com/pkryger/difftastic.el.git"
              :rev :newest))
#+end_src

** TODO [#B] Emacs Add Magit Forge Functionality               :enhancement:

https://github.com/magit/forge
https://magit.vc/manual/forge/Setup-for-Githubcom.html

Example usage from sqrtminusone
#+begin_src emacs-lisp
  (use-package forge
    :after magit
    :straight t
    :config
    (add-to-list 'forge-alist '("gitlab.etu.ru"
                                "gitlab.etu.ru/api/v4"
                                "gitlab.etu.ru"
                                forge-gitlab-repository)))
#+end_src

** TODO [#B] Emacs error if no file in buffer-and-file operations      :bug:
** DOING [#B] Eshell Improvements                              :enhancement:
*** TODO [#C] Add mu4e add file as attachment                 :enhancement:
*** AI Suggested
**** Improved Directory Navigation with =eshell-z=

#+begin_src emacs-lisp
(use-package eshell-z
  :after eshell
  :config
  (add-hook 'eshell-mode-hook
            (lambda () (require 'eshell-z))))
#+end_src

**** Directory Tracking and Shell Command Execution Improvements

#+begin_src emacs-lisp
;; Allow Eshell to track directory changes in external shells
(use-package eshell-prompt-extras
  :after eshell
  :config
  (setq eshell-highlight-prompt nil
        eshell-prompt-function 'epe-theme-lambda))

;; Utility to run shell commands from anywhere
(defun cj/eshell-command-on-region-file (command)
  "Run shell COMMAND on the contents of region or current line.
If region is active, use that, otherwise use the current line."
  (interactive (list (read-shell-command "Shell command on region: ")))
  (let* ((text (if (use-region-p)
                   (buffer-substring-no-properties (region-beginning) (region-end))
                 (buffer-substring-no-properties (line-beginning-position) (line-end-position))))
         (temp-file (make-temp-file "eshell-cmd-"))
         (output-buffer (generate-new-buffer "*Shell Command Output*")))
    (with-temp-file temp-file
      (insert text))
    (with-current-buffer output-buffer
      (insert (shell-command-to-string (format "%s %s" command temp-file)))
      (pop-to-buffer output-buffer))
    (delete-file temp-file)))

(global-set-key (kbd "C-c !") 'cj/eshell-command-on-region-file)
#+end_src

**** Enhanced Visual Output and ANSI Colors

#+begin_src emacs-lisp

;; Better handling of visual commands
(defun cj/eshell-exec-visual-and-kill ()
  "Execute the command via `eshell-exec-visual' and then kill the eshell buffer."
  (interactive)
  (let ((command (buffer-substring-no-properties
                  eshell-last-output-end (point-max))))
    (kill-buffer)
    (eshell-exec-visual command)))

;; Add this to your eshell aliases
(add-hook 'eshell-mode-hook
          (lambda ()
            (eshell/alias "vk" 'cj/eshell-exec-visual-and-kill)))
#+end_src

**** Buffer Management and Layout Improvements

#+begin_src emacs-lisp
;; Auto rename eshell buffers based on current directory
(defun cj/eshell-rename-buffer-as-dir ()
  "Rename the eshell buffer to include the current directory."
  (let ((dir (abbreviate-file-name (eshell/pwd))))
    (rename-buffer (format "*eshell: %s*" dir) t)))

(add-hook 'eshell-directory-change-hook 'cj/eshell-rename-buffer-as-dir)

;; Split eshell in a sensible way based on window size
(defun cj/eshell-pop-window ()
  "Open eshell in a sensible way depending on window dimensions."
  (interactive)
  (let ((width-percentage 0.3)
        (height-percentage 0.3)
        (current-window-width (window-width))
        (current-window-height (window-height)))
    (if (> current-window-width (* 2 current-window-height))
        ;; For wide windows, split side by side
        (let ((width (floor (* current-window-width width-percentage))))
          (split-window-horizontally (- current-window-width width))
          (other-window 1)
          (eshell))
      ;; For tall windows, split top/bottom
      (let ((height (floor (* current-window-height height-percentage))))
        (split-window-vertically (- current-window-height height))
        (other-window 1)
        (eshell)))))

(global-set-key (kbd "C-c e") 'cj/eshell-pop-window)
#+end_src

**** Useful Utility Functions

#+begin_src emacs-lisp
;; Enhanced eshell clear that preserves history
(defun cj/eshell-clear-buffer ()
  "Clear the eshell buffer, preserving the prompt and history."
  (interactive)
  (let ((inhibit-read-only t))
    (erase-buffer)
    (eshell-send-input)))
(add-hook 'eshell-mode-hook
          (lambda () (local-set-key (kbd "C-l") 'cj/eshell-clear-buffer)))

;; Function to insert the output of elisp expressions into eshell
(defun cj/eshell-insert-elisp-output (elisp)
  "Evaluate ELISP expression and insert its value at point in eshell."
  (interactive "sEval Elisp: ")
  (let ((result (eval (read elisp))))
    (insert (if (stringp result)
                result
              (format "%S" result)))))
(add-hook 'eshell-mode-hook
          (lambda () (local-set-key (kbd "C-c C-e") 'cj/eshell-insert-elisp-output)))

;; Quick file manager in eshell
(defun eshell/fman (file)
  "Open FILE in a file manager."
  (cond
   ((eq system-type 'darwin)    (shell-command (format "open %s" (expand-file-name default-directory))))
   ((eq system-type 'gnu/linux) (shell-command (format "xdg-open %s" (expand-file-name default-directory))))))

;; Enhanced cd command that respects projects
(defun eshell/pcd ()
  "Change directory to the project root."
  (let ((dir (cond 
              ((fboundp 'projectile-project-root) (projectile-project-root))
              ((fboundp 'project-root) (project-root (project-current)))
              (t (error "No project system available")))))
    (if dir
        (eshell/cd dir)
      (error "Not in a project"))))
#+end_src

** TODO [#B] Fix Emacs Alarms for Scheduled Events                     :bug:
*** 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 "<br>Appointment in $TIME minutes:<br>$MSG<br>"
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 [#B] Get Dupre Theme Working                                   :bug:
*** AI Suggestioms
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

** TODO [#B] Org Agenda Work                                   :enhancement:
*** TODO [#B] Add Past Due to F8 Agenda Summary in Emacs
*** TODO [#B] Separate B and C in F8 Agenda Summary in Emacs
** TODO [#B] Review/Implement AI keyboard macros suggestions   :enhancement:
[[file:ai-conversations/keyboard-macro-improvements_20250906-230640.gptel::+STARTUP: showeverything][keyboard macros conversation]]
** TODO [#C] Emacs: Add Reverso Functionality                  :enhancement:
https://sqrtminusone.xyz/packages/reverso/
check his config for a usage example

Reverso

reverso.el is a package of mine that provides Emacs interface for https://reverso.net.
#+begin_src emacs-lisp
  (use-package reverso
    :straight (:host github :repo "SqrtMinusOne/reverso.el")
    :init
    (my-leader-def "ar" #'reverso)
    :commands (reverso)
    :config
    (setq reverso-languages '(russian english german))
    (reverso-history-mode))
#+end_src
** TODO [#C] Implement Backup file in dirvish/eshell           :enhancement:
*** Emacs: Backup Current File 📜
[[http://xahlee.info/emacs/emacs/elisp_make-backup.html][Emacs: Backup Current File 📜]]
Captured On: [2025-09-03 Wed 11:48]

** TODO [#C] Org keyword discolored until reapplying theme             :bug:
* Emacs Next Release: 0.9
** DOING [#A] Jumper Package                                   :enhancement:
*** Specification
**** variable:custom: jumper-max-locations
maximum number of locations to store: default 10
**** variable:internal: jumper--registers
vector of used registers:
(make-register jumper-max-locations nil)
**** variable:internal: jumper--last-location-register
register used to store the last location: ?z
**** method:internal: jumper--point-matches-register
#+begin_src emacs-lisp
  ;; First store a position in register 'a'
  (point-to-register ?a)

  ;; Later, check if current position matches what's in register 'a'
  (if (cj/point-matches-register ?a)
      (message "Current position matches register 'a'")
    (message "Current position differs from register 'a'"))


  (defun cj/point-matches-register (register)
    "Return t if current position matches position stored in REGISTER.
      REGISTER is a character representing the register to check against.
      Returns nil if the register doesn't exist or doesn't contain position information."
    (let ((reg-val (get-register register)))
      (when (and reg-val
                 (markerp reg-val)
                 (marker-buffer reg-val)
                 (eq (current-buffer) (marker-buffer reg-val))
                 (= (point) (marker-position reg-val)))
        t)))
#+end_src
**** method: 
**** method: save-last-position
saves location to register z: (point-to-register ?z)
**** method: save-to-next-register
gets next free register in the sequence
calls (save-last-position)
saves using (point-to-register REGISTER &optional ARG)
*** 2025-09-02 Tue @ 14:06:03 -0500 Functionality Description
Tentative Package Name: Jumper
I typically use registers to jump between places, but I often forget the keybindings. Also, I sometimes overwrite registers by hitting the wrong key. Many Emacs users  don't even know about registers. I've seen posts from software developers asking how to conveniently store and jump to specific locations in a large code base.

To solve this I'd like to write a little elisp package that leverages Emacs vanilla register functionality to make jumping between locations using registers simple and transparent. The user won't have to think about registers or what character they've stored their location in at all. All keybindings will be based on keys from home row of the keyboard.

Preliminaries:
We will map the functionality to the keybinding prefix C-; j, but the prefix should be easy to configure.

Let's imagine a set of characters in a sequence. They could be any characters, but for the sake of simplicity we'll use the numbers from 0 to 9, and a one more character used for the "last location" -- the character "z".

What follows is a description of the workflow:
**** Adding Locations
keybinding: <prefix> space (store destination)
If the user is visiting a buffer and presses <prefix> space,
- the current location is stored in the next free register. if this is the first time they are storing a location, the first free register is 0.
user feedback: a message is displayed in the echo area saying "location stored."
If the user stays on the same location and presses prefix <space> again, they should receive a message in the echo area saying the location is already stored, and no changes to the register is made.

If the user moves to a new location and presses prefix <space> again, the next free register is used to store the location, in this case it would be 1. They can then iterate and store additional locations up to the last character in the sequence up to the limit of 10 registers (0 through 9). If they try to store a register after all 10 registers are filled, they will receive a message ("sorry - all jump locations are filled!").
**** Jump-To A Location
keybinding: <prefix> j (jump to destination)
NOTE: Whenever the user presses <prefix> j, that location is automatically stored in the "last location" register z.
***** When only one location is stored, and the user presses <prefix> j:
If there is only one location stored, the user IS at the location, and they press <prefix> j, they see an echo area message "you're already at the stored location."
If there is only one location stored in the sequence, and the user is NOT at that location, their location is stored in register z, then the user is immediately to their destination location via (jump-to-register).
user feedback: a message is displayed in the echo area saying "jumped to location."
If the user presses <prefix> J again, they are automatically taken back to the location in register z. and the same user feedback message is displayed.
In other words, after the user stores one location and moves elsewhere, pressing <prefix> j will jump back and forth between the two places.
***** When multiple locations are stored, and the user presses <prefix> j:
A completing read is displayed with all the locations between 0 and 9 along with register z (their last location) at the bottom.
Each line contains the letter as well as the content that the register would normally display. In other words, it could just be the register list is displayed, but narrowed down to 0 - 9 and z.

When the user chooses a location 0 -9, z from completing read:
- The current location is stored in register z, replacing their last location
- They are taken to the location via (jump-to-register).
user feedback: a message is displayed in the echo area saying "jumped to location."
**** Removing Locations
keybinding: <prefix> d
A completing read is displayed with the first item (where the cursor is on) being "Cancel".
The rest of the registers are displayed in descending order, i.e., from 9 to 0.
Note: the z register is not displayed.
Selecting a register from the list:
- removes that item from the list, and removes the location stored in the register.
- if the item is NOT the top one in the register, it reorders the rest of the sequence
  in other words, if 0 - 9 are all stored, and:
  the user removes item 7:
  - location 8 is restored in 7
  - location 9 is stored in 8
  the user removes item 0
  - location 1 is stored in 0
  - location 2 is stored in 1
  - location 3 is stored in 2
  - location 4 is stored in 3
  - location 5 is stored in 4
  - location 6 is stored in 5
  - location 7 is stored in 6
  - location 8 is stored in 7
  - location 9 is stored in 8
user feedback: a message is displayed in the echo area saying "location removed."
**** Open Questions
- Are there buffers which the user should not be able to store in a register?
- How can we prevent the user from creating issues by adding to the registers 0 through 9 by M-x point-to-register or it's keybinding? Is there a way to block or reserve those registers? Or is it better to just choose a sequence that is the least likely to be used by a human user? If so, what would that sequence be?
- Is 10 registers enough for a normal developer?
- I should probably
- Can I use a vector/list internally and map to registers behind the scenes?
Depending on context, can I add the
- Function name at point
- File name + line number
- First few words of the line
Do we think the reordering behavior when deleting locations might confuse users? How to simplify?
What happens if a buffer is deleted that doesn't have a file associated with it? If we're using registers underneath, how do registers handle this?
** TODO [#C] Review Titlecase Functionality
added in custom. Came from: https://codeberg.org/acdw/titlecase.el
Originally seen at https://emacselements.com/true-titlecase-in-emacs.html
** TODO [#C] Revisit and Refactor Localrepo Functionality
** 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 [#C] Emacs Change Appropriate Use-package Installs to :vc
especially where you're cloning them to provide fixes
** TODO [#C] Emacs Config: Narrowing Org doesn't allow refresh by type
After generating an org agenda list, I can narrow the type to all DONE or IN-PROGRESS. However when I use my custom functions to just get the agenda for the current buffer, I can't. The scope has now widened and the refresh is for all buffers.
** TODO [#C] Add a Restrict to Subtree Org Agenda Command
In Org-mode the “agenda” machinery by default doesn’t pay any attention to your buffer­narrow — it always scans whole files in your =org-agenda-files=.  However, you can teach Org-agenda to only look between two points (the start and end of your current subtree) by using the built-in “restrict” hooks:

1.  =org‐agenda‐restrict=         – turn on restriction
2.  =org‐agenda‐restrict‐begin=  – a marker or position where scanning begins
3.  =org‐agenda‐restrict‐end=    – where it ends
4.  (optionally) set =org-agenda-files= to just your current file

Here is a drop-in =org-agenda-custom-commands= entry that will give you a “Subtree TODOs” view limited to the subtree you’re on.  Put this in your Emacs init:

#+begin_src  emacs-lisp
  ;; -------------------------------------------------------------------
  ;; 1) Define a custom agenda command "C" (hit C-c a C)
  ;;    that shows only TODO entries in the current subtree.
  ;; -------------------------------------------------------------------
  (with-eval-after-load 'org
    (add-to-list 'org-agenda-custom-commands
                 '("C"                                ; the key you press after C-c a
                   "Subtree TODOs"                   ; a descriptive name
                   ((todo ""                         ; match any TODO keyword
                          ;; === per-block settings ===
                          ;; only look in this file
                          (org-agenda-files (list buffer-file-name))
                          ;; enable the restriction engine
                          (org-agenda-restrict t)
                          ;; start at the top of the current heading
                          (org-agenda-restrict-begin
                           (progn (org-back-to-heading t) (point)))
                          ;; end at the end of this subtree
                          (org-agenda-restrict-end
                           (progn (org-end-of-subtree t) (point))))
                    ;; you can add more blocks here if you like
                    ))))
#+end_src

How this works, step by step:

• We bind a new custom command under the key “C” (so you’ll type =C-c a C=).
• In that command we use the =todo= matcher =""= to catch every headline whose state is one of your TODO keywords.
• We dynamically set
– =org-agenda-files= to just the current buffer’s file,
– =org-agenda-restrict= to non-nil so Org will honor the begin/end markers,
– =org-agenda-restrict-begin= to the position of the current heading,
– =org-agenda-restrict-end= to the end of the subtree.

When you invoke it (=C-c a C=), Org will only scan headlines in that slice of the file and will build you a mini-agenda of TODO items from exactly that subtree.

Quick alternative: if you don’t need the full agenda machinery (dates, deadlines, etc.) but just want a fast outline of your TODOs under the current heading, you can also use the sparse-tree command:

• =C-c / t=  ⇒ shows only the TODO headings in the narrowed or whole buffer as an indented outline.

— Tips & Pitfalls —

• Make sure your file is saved and in =org-agenda-files= (the snippet above forces it).
• Remember to call =org-narrow-to-subtree= (or let the command compute its own begin/end via =org-back-to-heading=/=org-end-of-subtree=).
• If you rename or move your file, Emacs must still see =buffer-file-name= valid.
• You can duplicate the above snippet for other TODO states, agenda views, or matchers (deadlines, tags, etc.)

With this in place you effectively get an agenda tailored to exactly the bit of tree you’re working on.

** TODO [#C] Find Another Keymapping for Emojify
** 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]

** TODO [#D] Add test document to test graphviz-dot-mode
** TODO [#D] Consider Replicating Some of This Auctex and PDF Tools Code
[[https://www.reddit.com/r/emacs/comments/cd6fe2/how_to_make_emacs_a_latex_ide/][How to make Emacs a Latex IDE? : r/emacs]]
Captured On: [2025-08-14 Thu 03:43]

** 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.]]
[[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]
** 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]

** My PDF Tools Settings
[[https://emacselements.com/pdf-tools-settings.html][My PDF Tools Settings]]
Captured On: [2025-09-03 Wed 11:49]

** 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 [#B] Get Tufte.css working and as a separate entry
Below is one way to get Org-mode’s HTML exporter to play nicely with Tufte-CSS.  The basic recipe is:

1. Inject Tufte’s stylesheet into every HTML export
2. Teach Org to emit the little “margin-toggle” + “sidenote” markup that tufte.css expects for footnotes
3. (Optionally) wrap images in <figure> so you get tufte-style captions out of the box

Along the way you’ll see where Org’s default HTML‐classes line up with tufte.css and where you have to override them.

— 1 Inject tufte.css into your exports
Put tufte.css somewhere your exported HTML can see it (for example
~/.emacs.d/assets/tufte.css or a URL on your webserver).  Then in your init.el:

(with-eval-after-load 'ox-html
;; 1a) tell Org to link in your tufte.css
(setq org-html-head-extra
"<link rel=\"stylesheet\" href=\"/assets/tufte.css\" type=\"text/css\"/>")
;; 1b) enable HTML5 “fancy” output (so you get <figure> around images)
(setq org-html-html5-fancy t
org-html-inline-images  t))

— 2 Turn Org footnotes into Tufte sidenotes
By default Org emits
<sup class=…><a href="#fn:1" id="fnref:1">[1]</a></sup>
…and then a big =<div id="footnotes">= at the bottom.

Tufte-CSS wants each footnote inline, wrapped in
<label class="margin-toggle">⊕</label>
<input type="checkbox" class="margin-toggle"/>
<span class="sidenote">…your note…</span>

We can override two Org variables:

(with-eval-after-load 'ox-html
;; format of each inline footnote reference
(setq org-html-footnote-format
(concat
"<label for=\"%1$s\" class=\"margin-toggle\">"
"&#8853;</label>"
"<input type=\"checkbox\" id=\"%1$s\" class=\"margin-toggle\"/>"
"<span class=\"sidenote\">%2$s</span>"))
;; drop Org’s default footnote list at the end
(setq org-html-footnote-separator ""))

Once you do that, exporting an Org file with footnotes will generate the markup tufte.css needs to float them in the margin.

— 3 (Optionally) get <figure> + <figcaption> around images
If you set =org-html-html5-fancy= to t (see step 1) Org will automatically emit:

<figure>
<img src="…"/>
<figcaption>Your caption</figcaption>
</figure>

and tufte.css already has rules for =<figure class="figure">= etc.

— 4 Common pitfalls
• Make sure your href in =org-html-head-extra= actually points to the css that the browser can load (absolute vs. relative).
• If you still see a “Footnotes” section at the bottom, double-check that =org-html-footnote-separator= is set to the empty string and that your init-file got re-evaluated.
• On Windows or if you’re testing locally, run e.g. =python3 -m http.server= inside your export folder so your browser can fetch the CSS.

— 5 Unit test for your footnote hack
Drop this in =~/.emacs.d/tests/test-org-tufte.el= and run =M-x ert RET t RET=:

(require 'ert)
;; load your config; adjust the path if necessary
(load-file "~/.emacs.d/init.el")

(ert-deftest org-tufte-footnote-format-test ()
"Ensure each footnote reference becomes a margin-toggle + sidenote."
(let/ ((id      "fn:42")
(content "My note.")
(html    (format org-html-footnote-format id content)))
(should (string-match-p "class=\"margin-toggle\"" html))
(should (string-match-p "<span class=\"sidenote\">My note\\.</span>" html))
;; it must not accidentally reintroduce Org’s bottom-of-page footnote div
(should-not (string-match-p "div id=\"footnotes\"" html))))

Once that test passes, you know your footnotes are being rewritten into Tufte-style side notes.  From there, you can sprinkle in additional filters (e.g. wrap =<blockquote>= in a =.sidenote= class, override list/p table styles, etc.) or just let the rest of tufte.css style Org’s default tags (h1, p, ul, table, code, etc.).

Enjoy your beautifully-typeset Org → HTML exports in true Tufte style!

* Emacs Config 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]
** 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]
** 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]
** Craft an Email Workflow with Org Mode - YouTube
[[https://www.youtube.com/watch?v=dSZu4jwvaSs][Craft an Email Workflow with Org Mode - YouTube]]
Captured On: [2025-08-30 Sat 11:42]
** Enhance Your Emails with Org Mode - System Crafters
[[https://systemcrafters.net/emacs-mail/enhance-email-with-org-mode/][Enhance Your Emails with Org Mode - System Crafters]]
Captured On: [2025-08-30 Sat 11:42]
** Emacs As Mail Client Specifically as Mu4E | Unixbhaskar's Blog
[[https://unixbhaskar.wordpress.com/2023/09/05/emacs-as-mail-client-specifically-as-mu4e/][Emacs As Mail Client Specifically as Mu4E | Unixbhaskar's Blog]]
Captured On: [2025-08-29 Fri 16:12]
** Blogging with Emacs, and Emacs only | Diego Vicente
[[https://diego.codes/post/blogging-with-org/][Blogging with Emacs, and Emacs only | Diego Vicente]]
Captured On: [2025-08-18 Mon 17:57]
** Using Emacs and Org-mode as a static site generator
[[https://ogbe.net/blog/emacs_org_static_site][Using Emacs and Org-mode as a static site generator]]
Captured On: [2025-08-18 Mon 17:54]
** The best latex Editor : r/emacs
[[https://www.reddit.com/r/emacs/comments/akmwko/the_best_latex_editor/][The best latex Editor : r/emacs]]
Captured On: [2025-08-13 Wed 19:29]
** gregoryg/emacs-gregoryg: My emacs settings for use across Linux, Windows, OS X
[[https://github.com/gregoryg/emacs-gregoryg?tab=readme-ov-file#gptel---llms-in-markdown-and-org-mode][gregoryg/emacs-gregoryg: My emacs settings for use across Linux, Windows, OS X]]
Captured On: [2025-08-12 Tue 16:31]