diff options
-rw-r--r-- | README.md | 248 |
1 files changed, 191 insertions, 57 deletions
diff --git a/README.md b/README.md index 6d64472..1eb5351 100644 --- a/README.md +++ b/README.md | |||
@@ -4,8 +4,8 @@ This is my Emacs configuration. It's also a literate `org-mode` file. Yeah, I' | |||
4 | # About me | 4 | # About me |
5 | 5 | ||
6 | ;; init.el -*- lexical-binding: t -*- | 6 | ;; init.el -*- lexical-binding: t -*- |
7 | (setq user-full-name "Case Duckworth" | 7 | (setq user-full-name "Case Duckworth" |
8 | user-mail-address "acdw@acdw.net") | 8 | user-mail-address "acdw@acdw.net") |
9 | 9 | ||
10 | 10 | ||
11 | # License | 11 | # License |
@@ -67,6 +67,7 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w | |||
67 | (when (equal (buffer-file-name) | 67 | (when (equal (buffer-file-name) |
68 | (expand-file-name | 68 | (expand-file-name |
69 | (concat user-emacs-directory "config.org"))) | 69 | (concat user-emacs-directory "config.org"))) |
70 | ;; Tangle and load init.el and early-init.el | ||
70 | (require 'async) | 71 | (require 'async) |
71 | (async-start | 72 | (async-start |
72 | (lambda () | 73 | (lambda () |
@@ -92,11 +93,12 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w | |||
92 | ## Miscellaneous bootstrappy stuff | 93 | ## Miscellaneous bootstrappy stuff |
93 | 94 | ||
94 | 95 | ||
95 | ### Add `~/.emacs.d/lisp/` to `load-path` | 96 | ### Add directories to `load-path` |
96 | 97 | ||
97 | (add-to-list 'load-path | 98 | (dolist (dir `(,(concat user-emacs-directory |
98 | (concat user-emacs-directory | 99 | (convert-standard-filename "lisp/")) |
99 | (convert-standard-filename "lisp/"))) | 100 | ,(expand-file-name "~/Sync/elisp/"))) |
101 | (add-to-list 'load-path dir)) | ||
100 | 102 | ||
101 | 103 | ||
102 | ### Require my secrets | 104 | ### Require my secrets |
@@ -107,8 +109,7 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w | |||
107 | # Early initiation | 109 | # Early initiation |
108 | 110 | ||
109 | ;; early-init.el -*- lexical-binding: t; no-byte-compile: t -*- | 111 | ;; early-init.el -*- lexical-binding: t; no-byte-compile: t -*- |
110 | 112 | (setq load-prefer-newer t) | |
111 | (setq load-prefer-newer t) | ||
112 | 113 | ||
113 | 114 | ||
114 | ## Increase the garbage collector | 115 | ## Increase the garbage collector |
@@ -239,11 +240,33 @@ I also want to switch themes between night and day. | |||
239 | # Simplify GUI | 240 | # Simplify GUI |
240 | 241 | ||
241 | 242 | ||
243 | ## Frame defaults | ||
244 | |||
245 | (cuss default-frame-alist | ||
246 | '((tool-bar-lines . 0) | ||
247 | (menu-bar-lines . 0) | ||
248 | (vertical-scroll-bars . 'right) | ||
249 | (horizontal-scroll-bars . nil) | ||
250 | (right-divider-width . 2) | ||
251 | (bottom-divider-width . 2) | ||
252 | (left-fringe-width . 2) | ||
253 | (right-fringe-width . 2))) | ||
254 | |||
255 | |||
256 | ## Minibuffer window/frame defaults | ||
257 | |||
258 | (cuss minibuffer-frame-alist | ||
259 | '((width . 80) | ||
260 | (height . 2) | ||
261 | (vertical-scrollbars . nil))) | ||
262 | |||
263 | (set-window-scroll-bars (minibuffer-window) nil nil) | ||
264 | |||
265 | |||
242 | ## Remove unneeded GUI elements | 266 | ## Remove unneeded GUI elements |
243 | 267 | ||
244 | (menu-bar-mode -1) | 268 | (menu-bar-mode -1) |
245 | (tool-bar-mode -1) | 269 | (tool-bar-mode -1) |
246 | (scroll-bar-mode -1) | ||
247 | (horizontal-scroll-bar-mode -1) | 270 | (horizontal-scroll-bar-mode -1) |
248 | 271 | ||
249 | 272 | ||
@@ -273,6 +296,17 @@ I also want to switch themes between night and day. | |||
273 | (rm/whitelist-add "^$")) | 296 | (rm/whitelist-add "^$")) |
274 | 297 | ||
275 | 298 | ||
299 | ## Minibuffer | ||
300 | |||
301 | |||
302 | ### Keep cursor from going into the prompt | ||
303 | |||
304 | from [Ergo Emacs](http://ergoemacs.org/emacs/emacs_stop_cursor_enter_prompt.html). | ||
305 | |||
306 | (cuss minibuffer-prompt-properties | ||
307 | '(read-only t cursor-intangible t face minibuffer-prompt)) | ||
308 | |||
309 | |||
276 | ## Show `^L` as a line | 310 | ## Show `^L` as a line |
277 | 311 | ||
278 | (use-package form-feed | 312 | (use-package form-feed |
@@ -320,7 +354,7 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que | |||
320 | (set-face-attribute 'variable-pitch nil | 354 | (set-face-attribute 'variable-pitch nil |
321 | :font | 355 | :font |
322 | (font-candidate | 356 | (font-candidate |
323 | "Libertinus Serif-14" | 357 | "Libertinus Serif-13" |
324 | "Linux Libertine O-12" | 358 | "Linux Libertine O-12" |
325 | "Georgia-11")) | 359 | "Georgia-11")) |
326 | 360 | ||
@@ -912,46 +946,6 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) | |||
912 | (add-hook 'prog-mode-hook #'acdw/enable-line-numbers) | 946 | (add-hook 'prog-mode-hook #'acdw/enable-line-numbers) |
913 | 947 | ||
914 | 948 | ||
915 | ## Git | ||
916 | |||
917 | (use-package magit | ||
918 | :bind | ||
919 | ("C-x g" . magit-status) | ||
920 | :custom-update | ||
921 | (magit-no-confirm '(stage-all-changes))) | ||
922 | |||
923 | |||
924 | ### Hook into `prescient` | ||
925 | |||
926 | (define-advice magit-list-refs | ||
927 | (:around (orig &optional namespaces format sortby) | ||
928 | prescient-sort) | ||
929 | "Apply prescient sorting when listing refs." | ||
930 | (let ((res (funcall orig namespaces format sortby))) | ||
931 | (if (or sortby | ||
932 | magit-list-refs-sortby | ||
933 | (not selectrum-should-sort-p)) | ||
934 | res | ||
935 | (prescient-sort res)))) | ||
936 | |||
937 | |||
938 | ### Use `libgit` when I can build it (requires `cmake`) | ||
939 | |||
940 | (when (executable-find "cmake") | ||
941 | (use-package libgit) | ||
942 | (use-package magit-libgit)) | ||
943 | |||
944 | |||
945 | ### Git "forge" capabilities | ||
946 | |||
947 | (use-package forge | ||
948 | :after magit | ||
949 | :unless (eq system-type 'windows-nt) | ||
950 | :custom | ||
951 | (forge-owned-accounts | ||
952 | '(("duckwork")))) | ||
953 | |||
954 | |||
955 | ## Programming languages | 949 | ## Programming languages |
956 | 950 | ||
957 | 951 | ||
@@ -1000,12 +994,74 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) | |||
1000 | ### Go | 994 | ### Go |
1001 | 995 | ||
1002 | (use-package go-mode | 996 | (use-package go-mode |
1003 | :mode "\\.go\\'") | 997 | :mode "\\.go\\'" |
998 | :hook | ||
999 | (before-save . gofmt-before-save)) | ||
1004 | 1000 | ||
1005 | 1001 | ||
1006 | # Applications | 1002 | # Applications |
1007 | 1003 | ||
1008 | 1004 | ||
1005 | ## Git | ||
1006 | |||
1007 | (use-package magit | ||
1008 | :bind | ||
1009 | ("C-x g" . magit-status) | ||
1010 | :custom-update | ||
1011 | (magit-no-confirm '(stage-all-changes))) | ||
1012 | |||
1013 | |||
1014 | ### Hook into `prescient` | ||
1015 | |||
1016 | (define-advice magit-list-refs | ||
1017 | (:around (orig &optional namespaces format sortby) | ||
1018 | prescient-sort) | ||
1019 | "Apply prescient sorting when listing refs." | ||
1020 | (let ((res (funcall orig namespaces format sortby))) | ||
1021 | (if (or sortby | ||
1022 | magit-list-refs-sortby | ||
1023 | (not selectrum-should-sort-p)) | ||
1024 | res | ||
1025 | (prescient-sort res)))) | ||
1026 | |||
1027 | |||
1028 | ### Use `libgit` when I can build it (requires `cmake`) | ||
1029 | |||
1030 | (when (executable-find "cmake") | ||
1031 | (use-package libgit) | ||
1032 | (use-package magit-libgit)) | ||
1033 | |||
1034 | |||
1035 | ### Git "forge" capabilities | ||
1036 | |||
1037 | (use-package forge | ||
1038 | :after magit | ||
1039 | :unless (eq system-type 'windows-nt) | ||
1040 | :custom | ||
1041 | (forge-owned-accounts | ||
1042 | '(("duckwork")))) | ||
1043 | |||
1044 | |||
1045 | ## Dired | ||
1046 | |||
1047 | (with-eval-after-load 'dired | ||
1048 | (cuss dired-dwim-target t) | ||
1049 | (cuss dired-listing-switches "-alDh") | ||
1050 | |||
1051 | (cuss wdired-allow-to-change-permissions t) | ||
1052 | (bind-key "C-c w" #'wdired-change-to-wdired-mode 'dired-mode-map)) | ||
1053 | |||
1054 | |||
1055 | ## Proced | ||
1056 | |||
1057 | (defun acdw/setup-proced () | ||
1058 | (variable-pitch-mode -1) | ||
1059 | (toggle-truncate-lines 1) | ||
1060 | (proced-toggle-auto-update 1)) | ||
1061 | |||
1062 | (add-hook 'proced-mode-hook #'acdw/setup-proced) | ||
1063 | |||
1064 | |||
1009 | ## Elpher | 1065 | ## Elpher |
1010 | 1066 | ||
1011 | (use-package elpher | 1067 | (use-package elpher |
@@ -1066,12 +1122,90 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) | |||
1066 | 1122 | ||
1067 | ## Pastebin (0x0) | 1123 | ## Pastebin (0x0) |
1068 | 1124 | ||
1069 | (use-package 0x0 | 1125 | (use-package 0x0 |
1070 | :custom | 1126 | :custom |
1071 | (0x0-default-service 'ttm)) | 1127 | (0x0-default-service 'ttm)) |
1128 | |||
1129 | |||
1130 | ## Mu4e | ||
1131 | |||
1132 | (when (executable-find "mu") | ||
1133 | (add-to-list 'load-path | ||
1134 | "/usr/share/emacs/site-lisp/mu4e") | ||
1135 | (require 'mu4e) | ||
1136 | |||
1137 | (cuss mail-user-agent 'mu4e-user-agent) | ||
1138 | |||
1139 | (cuss mu4e-headers-skip-duplicates t) | ||
1140 | (cuss mu4e-view-show-images t) | ||
1141 | (cuss mu4e-view-show-addresses t) | ||
1142 | (cuss mu4e-compose-format-flowed t) | ||
1143 | (cuss mu4e-change-filenames-when-moving t) | ||
1144 | (cuss mu4e-attachments-dir "~/Downloads") | ||
1145 | |||
1146 | (cuss mu4e-maildir "~/.mail/fastmail") | ||
1147 | (cuss mu4e-refile-folder "/Archive") | ||
1148 | (cuss mu4e-sent-folder "/Sent") | ||
1149 | (cuss mu4e-drafts-folder "/Drafts") | ||
1150 | (cuss mu4e-trash-folder "/Trash") | ||
1151 | |||
1152 | (fset 'my-move-to-trash "mTrash") | ||
1153 | (define-key mu4e-headers-mode-map (kbd "d") 'my-move-to-trash) | ||
1154 | (define-key mu4e-view-mode-map (kbd "d") 'my-move-to-trash) | ||
1155 | |||
1156 | (cuss message-send-mail-function 'smtpmail-send-it) | ||
1157 | (cuss smtpmail-default-smtp-server "smtp.fastmail.com") | ||
1158 | (cuss smtpmail-smtp-server "smtp.fastmail.com") | ||
1159 | (cuss smtpmail-stream-type 'ssl) | ||
1160 | (cuss smtpmail-smtp-service 465) | ||
1161 | (cuss smtpmail-local-domain "acdw.net") | ||
1162 | (cuss mu4e-compose-signature | ||
1163 | "Best,\nCase\n") | ||
1164 | |||
1165 | (cuss mu4e-get-mail-command "mbsync -a") | ||
1166 | (cuss mu4e-update-interval 300) | ||
1167 | |||
1168 | (cuss mu4e-completing-read-function 'completing-read) | ||
1169 | (cuss message-kill-buffer-on-exit t) | ||
1170 | (cuss mu4e-confirm-quit nil) | ||
1171 | |||
1172 | (cuss mu4e-bookmarks | ||
1173 | '(( | ||
1174 | :name "Unread" | ||
1175 | :query | ||
1176 | "flag:unread AND NOT flag:trashed AND NOT maildir:/Spam" | ||
1177 | :key ?u) | ||
1178 | ( | ||
1179 | :name "Today" | ||
1180 | :query "date:today..now and not maildir:/Spam" | ||
1181 | :key ?t) | ||
1182 | ( | ||
1183 | :name "This week" | ||
1184 | :query "date:7d..now and not maildir:/Spam" | ||
1185 | :hide-unread t | ||
1186 | :key ?w))) | ||
1187 | |||
1188 | (cuss mu4e-headers-fields | ||
1189 | '((:human-date . 12) | ||
1190 | (:flags . 6) | ||
1191 | (:mailing-list . 10) | ||
1192 | (:from-or-to . 22) | ||
1193 | (:subject))) | ||
1194 | ) | ||
1195 | |||
1196 | ;; not sure about this... | ||
1197 | (use-package mu4e-dashboard | ||
1198 | :straight (mu4e-dashboard | ||
1199 | :host github | ||
1200 | :repo "rougier/mu4e-dashboard" | ||
1201 | :branch "main")) | ||
1202 | |||
1072 | 1203 | ||
1204 | # Appendix A: `emacsdc` script | ||
1073 | 1205 | ||
1074 | ## EMMS | 1206 | Here's a wrapper script that'll start `emacs --daemon` if there isn't one, and then launche `emacsclient` on the arguments. I'd recommend installing with `ln -s emacsdc ~/.local/bin/` or something. Then you can set it as your `$EDITOR`! |
1075 | 1207 | ||
1076 | (use-package bongo | 1208 | if ! emacsclient -nc "$@" 2>/dev/null; then |
1077 | :commands 'bongo) | 1209 | emacs --daemon |
1210 | emacsclient -nc "$@" | ||
1211 | fi | ||