]> git.armaanb.net Git - config.org.git/blob - config.org
Set window title
[config.org.git] / config.org
1 #+TITLE: System Configuration
2 #+DESCRIPTION: Personal system configuration in org-mode format.
3 #+AUTHOR: Armaan Bhojwani
4 #+EMAIL: me@armaanb.net
5
6 * Welcome
7 Welcome to my system configuration! This file contains my Emacs configuration, but also my config files for many of the other programs on my system!
8 ** Compatability
9 I am currently using Emacs 27.2 on Linux, so some settings and packages may not be available for older versions of Emacs. This is a purely personal configuration, so while I can guarantee that it works on my setup, it might not work for you.
10 ** Choices
11 I chose to create a powerful, yet not overly heavy Emacs configuration. Things like a fancy modeline, icons, or LSP mode do not increase my productivity, and create visual clutter, and thus have been excluded.
12
13 Another important choice has been to integrate Emacs into a large part of my computing environment (see [[*Emacs OS]]). I use email, IRC, RSS, et cetera, all through Emacs which simplifies my workflow and creates an amazingly integrated environment.
14
15 Lastly, I use Evil mode. Modal keybindings are simpler and more ergonomic than standard Emacs style, and Vim keybindings are what I'm comfortable with and are pervasive throughout computing.
16 ** License
17 Released under the [[https://opensource.org/licenses/MIT][MIT license]] by Armaan Bhojwani, 2021. Note that many snippets are taken from online, and other sources, who are credited for their work near their contributions.
18 * Package management
19 ** Bootstrap straight.el
20 straight.el is really nice for managing package, and it integrates nicely with use-package. It uses the bootstrapping system defined here for installation.
21 #+begin_src emacs-lisp
22   (defvar native-comp-deferred-compilation-deny-list ())
23   (defvar bootstrap-version)
24   (let ((bootstrap-file
25          (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
26         (bootstrap-version 5))
27     (unless (file-exists-p bootstrap-file)
28       (with-current-buffer
29           (url-retrieve-synchronously
30            "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
31            'silent 'inhibit-cookies)
32         (goto-char (point-max))
33         (eval-print-last-sexp)))
34     (load bootstrap-file nil 'nomessage))
35 #+end_src
36 ** Replace package.el with straight
37 #+begin_src emacs-lisp
38   (straight-use-package 'use-package)
39   (setq straight-use-package-by-default t)
40 #+end_src
41 * Visual options
42 ** Theme
43 Use the Modus Operandi theme by Protesilaos Stavrou. Its the best theme for Emacs by far, because how clear and readable it is. It is highly customizable, but I just set a few options here.
44 #+begin_src emacs-lisp
45   (use-package modus-themes
46     :custom
47     (modus-themes-slanted-constructs t)
48     (modus-themes-bold-constructs t)
49     (modus-themes-mode-line '3d)
50     (modus-themes-scale-headings t)
51     (modus-themes-diffs 'desaturated)
52     :config (load-theme 'modus-vivendi t))
53 #+end_src
54 ** Typography
55 *** Font
56 JetBrains Mono is a great programming font with ligatures. The "NF" means that it has been patched with the [[https://www.nerdfonts.com/][Nerd Fonts]].
57 #+begin_src emacs-lisp
58   (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-11"))
59 #+end_src
60 *** Ligatures
61 #+begin_src emacs-lisp
62   (use-package ligature
63     :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
64     :config
65     (ligature-set-ligatures
66      '(prog-mode text-mode)
67      '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
68        "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
69        "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
70        "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
71        "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
72        ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
73        "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
74        "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
75        "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
76        "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
77        "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
78        "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
79     ;; (global-ligature-mode t))
80     )
81 #+end_src
82 ** Line numbers
83 Display relative line numbers except in certain modes.
84 #+begin_src emacs-lisp
85   (global-display-line-numbers-mode)
86   (setq display-line-numbers-type 'relative)
87   (dolist (no-line-num '(term-mode-hook
88                          pdf-view-mode-hook
89                          shell-mode-hook
90                          org-mode-hook
91                          circe-mode-hook
92                          eshell-mode-hook))
93     (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
94 #+end_src
95 ** Highlight matching parenthesis
96 #+begin_src emacs-lisp
97   (use-package paren
98     :config (show-paren-mode)
99     :custom (show-paren-style 'parenthesis))
100 #+end_src
101 ** Modeline
102 *** Show current function
103 #+begin_src emacs-lisp
104   (which-function-mode)
105 #+end_src
106 *** Make position in file more descriptive
107 Show current column and file size.
108 #+begin_src emacs-lisp
109   (column-number-mode)
110   (size-indication-mode)
111 #+end_src
112 *** Hide minor modes
113 #+begin_src emacs-lisp
114   (use-package minions
115     :config (minions-mode))
116 #+end_src
117 ** Whitespace mode
118 Highlight whitespace and other bad text practices.
119 #+begin_src emacs-lisp
120   (use-package whitespace
121     :custom (whitespace-style '(face lines-tail)))
122   (dolist (hook '(prog-mode-hook))
123     (add-hook hook (lambda () (whitespace-mode 1))))
124 #+end_src
125 ** Highlight todo items in comments
126 #+begin_src emacs-lisp
127   (use-package hl-todo
128     :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
129     :config (global-hl-todo-mode 1))
130 #+end_src
131 ** Blink cursor
132 #+begin_src emacs-lisp
133   (blink-cursor-mode)
134 #+end_src
135 ** Visual line mode
136 Soft wrap words and do operations by visual lines in some modes.
137 #+begin_src emacs-lisp
138   (dolist (hook '(text-mode-hook
139                   org-mode-hook
140                   markdown-mode-hook
141                   mu4e-view-mode-hook))
142     (add-hook hook (lambda () (visual-line-mode 1))))
143 #+end_src
144 ** Auto fill mode
145 #+begin_src emacs-lisp
146   (dolist (hook '(scdoc-mode-hook
147                   mu4e-compose-mode-hook))
148     (add-hook hook (lambda () (auto-fill-mode 1))))
149 #+end_src
150 ** Display number of matches in search
151 #+begin_src emacs-lisp
152   (use-package anzu
153     :after (evil)
154     :config (global-anzu-mode)
155     :bind
156     ([remap isearch-forward] . isearch-forward-regexp)
157     ([remap isearch-backward] . isearch-backward-regexp)
158     ([remap query-replace] . anzu-query-replace)
159     ([remap query-replace] . anzu-query-replace)
160     ([remap query-replace-regexp] . anzu-query-replace-regexp))
161 #+end_src
162 *** TODO This config doesn't work right
163 ** Visual bell
164 Invert modeline color instead of audible bell or the standard visual bell.
165 #+begin_src emacs-lisp
166   (setq visible-bell nil
167         ring-bell-function
168         (lambda () (invert-face 'mode-line)
169           (run-with-timer 0.1 nil #'invert-face 'mode-line)))
170 #+end_src
171 ** GUI
172 #+begin_src emacs-lisp
173   (scroll-bar-mode -1)
174   (tool-bar-mode -1)
175   (menu-bar-mode -1)
176   (setq-default frame-title-format '("%b [%m]"))
177 #+end_src
178 * Evil mode
179 ** General
180 #+begin_src emacs-lisp
181   (use-package evil
182     :custom (select-enable-clipboard nil)
183     :init (setq evil-want-keybinding nil
184                 evil-want-minibuffer t
185                 evil-want-C-d-scroll t
186                 evil-want-C-u-scroll t)
187     :config
188     (evil-mode)
189     (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
190     ;; Use visual line motions even outside of visual-line-mode buffers
191     (evil-global-set-key 'motion "j" 'evil-next-visual-line)
192     (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
193     :bind
194     ("<escape>" . keyboard-escape-quit)
195     ("C-M-u" . universal-argument))
196 #+end_src
197 ** Evil collection
198 Evil bindings for tons of packages.
199 #+begin_src emacs-lisp
200   (use-package evil-collection
201     :after evil
202     :init (evil-collection-init)
203     :custom (evil-collection-setup-minibuffer t))
204 #+end_src
205 ** Surround
206 tpope prevails!
207 #+begin_src emacs-lisp
208   (use-package evil-surround
209     :config (global-evil-surround-mode))
210 #+end_src
211 ** Nerd commenter
212 Makes commenting super easy
213 #+begin_src emacs-lisp
214   (use-package evil-nerd-commenter
215     :bind (:map evil-normal-state-map
216                 ("gc" . evilnc-comment-or-uncomment-lines))
217     :custom (evilnc-invert-comment-line-by-line nil))
218 #+end_src
219 ** Undo redo
220 Fix the oopsies!
221 #+begin_src emacs-lisp
222   (use-package undo-fu
223     :config (evil-set-undo-system 'undo-fu))
224
225   (use-package undo-fu-session
226     :config (global-undo-fu-session-mode))
227 #+end_src
228 ** Number incrementing
229 Add back C-a/C-x bindings.
230 #+begin_src emacs-lisp
231   (use-package evil-numbers
232     :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
233     :bind (:map evil-normal-state-map
234                 ("C-M-a" . evil-numbers/inc-at-pt)
235                 ("C-M-x" . evil-numbers/dec-at-pt)))
236 #+end_src
237 ** Evil org
238 #+begin_src emacs-lisp
239   (use-package evil-org
240     :after org
241     :hook (org-mode . evil-org-mode)
242     :config
243     (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
244
245   (use-package evil-org-agenda
246     :straight (:type built-in)
247     :after evil-org
248     :config (evil-org-agenda-set-keys))
249 #+end_src
250 * Org mode
251 ** General
252 #+begin_src emacs-lisp
253   (use-package org
254     :straight (:type built-in)
255     :commands (org-capture org-agenda)
256     :custom
257     (org-ellipsis " ▾")
258     (org-agenda-start-with-log-mode t)
259     (org-agenda-files (quote ("~/org/tasks.org")))
260     (org-log-done 'time)
261     (org-log-into-drawer t)
262     (org-src-tab-acts-natively t)
263     (org-src-fontify-natively t)
264     (org-startup-indented t)
265     (org-hide-emphasis-markers t)
266     (org-fontify-whole-block-delimiter-line nil)
267     (org-archive-default-command 'org-archive-to-archive-sibling)
268     :bind
269     ("C-c a" . org-agenda)
270     (:map evil-normal-state-map ("ga" . org-archive-subtree-default)))
271 #+end_src
272 ** Tempo
273 Define templates for lots of common structure elements. Mostly just used within this file.
274 #+begin_src emacs-lisp
275   (use-package org-tempo
276     :after org
277     :straight (:type built-in)
278     :config
279     (dolist (addition '(
280                         ("ash" . "src shell :tangle ~/.config/ash/ashrc")
281                         ("el" . "src emacs-lisp")
282                         ("git" . "src conf :tangle ~/.gitconfig")
283                         ("mb" . "src conf :tangle ~/.mbsyncrc")
284                         ("sp" . "src conf :tangle ~/.spectrwm.conf")
285                         ("tm" . "src conf :tangle ~/.tmux.conf")
286                         ("za" . "src conf :tangle ~/.config/zathura/zathurarc")
287                         ))
288       (add-to-list 'org-structure-template-alist addition)))
289 #+end_src
290 * Autocompletion
291 ** Ivy
292 A well balanced completion framework.
293 #+begin_src emacs-lisp
294   (use-package ivy
295     :bind (:map ivy-minibuffer-map
296            ("TAB" . ivy-alt-done))
297            (:map ivy-switch-buffer-map
298            ("M-d" . ivy-switch-buffer-kill))
299     :config (ivy-mode))
300 #+end_src
301 ** Ivy-rich
302 #+begin_src emacs-lisp
303   (use-package ivy-rich
304     :after (ivy counsel)
305     :config (ivy-rich-mode))
306 #+end_src
307 ** Counsel
308 Ivy everywhere.
309 #+begin_src emacs-lisp
310   (use-package counsel
311     :bind ("C-M-j" . 'counsel-switch-buffer)
312     :config (counsel-mode))
313 #+end_src
314 ** Remember frequent commands
315 #+begin_src emacs-lisp
316   (use-package ivy-prescient
317     :after counsel
318     :config
319     (prescient-persist-mode)
320     (ivy-prescient-mode))
321 #+end_src
322 * Emacs OS
323 ** RSS
324 Use elfeed for reading RSS. I have another file with all the feeds in it that I'd rather keep private.
325 #+begin_src emacs-lisp
326   (use-package elfeed
327     :bind (("C-c e" . elfeed))
328     :config (load "~/.emacs.d/feeds.el")
329     :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
330 #+end_src
331 ** Email
332 Use mu4e and mbsync for reading emails.
333
334 Contexts are a not very well known feature of mu4e that makes it super easy to manage multiple accounts. Much better than some of the hacky methods and external packages that I've seen.
335 *** mbsync
336 **** General
337 #+begin_src conf :tangle ~/.mbsyncrc
338   Create Near
339   Expunge Both
340   SyncState *
341 #+end_src
342 **** Personal
343 #+begin_src conf :tangle ~/.mbsyncrc
344   IMAPStore personal-remote
345   Host imap.mailbox.org
346   User me@armaanb.net
347   PassCmd "pash show login.mailbox.org/me@armaanb.net | head -n 1"
348
349   MaildirStore personal-local
350   Path ~/mail/personal/
351   Inbox ~/mail/personal/Inbox
352   Subfolders Verbatim
353
354   Channel personal-channel
355   Far :personal-remote:
356   Near :personal-local:
357   Patterns "INBOX*" "Drafts" "Archive" "Sent" "Trash"
358
359   Group personal
360   Channel personal-channel
361 #+end_src
362 **** School
363 #+begin_src conf :tangle ~/.mbsyncrc
364   IMAPStore school-remote
365   SSLType IMAPS
366   Host imap.gmail.com
367   User abhojwani22@nobles.edu
368   PassCmd "pash show gmail-otp/abhojwani22@nobles.edu | head -n 1"
369
370   MaildirStore school-local
371   Path ~/mail/school/
372   Inbox ~/mail/school/Inbox
373   Subfolders Verbatim
374
375   Channel school-channel
376   Far :school-remote:
377   Near :school-local:
378   Patterns * ![Gmail]*
379
380   Group school
381   Channel school-channel
382 #+end_src
383 *** mu4e
384 **** Setup
385 #+begin_src emacs-lisp
386   (use-package smtpmail
387     :straight (:type built-in))
388   (use-package mu4e
389     :load-path "/usr/share/emacs/site-lisp/mu4e"
390     :straight (:build nil)
391     :bind (("C-c m" . mu4e))
392     :config
393     (setq user-full-name "Armaan Bhojwani"
394           smtpmail-local-domain "armaanb.net"
395           smtpmail-stream-type 'ssl
396           smtpmail-smtp-service '465
397           mu4e-change-filenames-when-moving t
398           mu4e-get-mail-command "mbsync -a"
399           message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
400           message-citation-line-function 'message-insert-formatted-citation-line
401           mu4e-completing-read-function 'ivy-completing-read
402           mu4e-confirm-quit nil
403           mu4e-view-use-gnus t
404           mail-user-agent 'mu4e-user-agent
405           mu4e-context-policy 'pick-first
406           mu4e-contexts
407           `( ,(make-mu4e-context
408                :name "school"
409                :enter-func (lambda () (mu4e-message "Entering school context"))
410                :leave-func (lambda () (mu4e-message "Leaving school context"))
411                :match-func (lambda (msg)
412                              (when msg
413                                (string-match-p "^/school" (mu4e-message-field msg :maildir))))
414                :vars '((user-mail-address . "abhojwani22@nobles.edu")
415                        (mu4e-sent-folder . "/school/Sent")
416                        (mu4e-drafts-folder . "/school/Drafts")
417                        (mu4e-trash-folder . "/school/Trash")
418                        (mu4e-refile-folder . "/school/Archive")
419                        (message-cite-reply-position . above)
420                        (user-mail-address . "abhojwani22@nobles.edu")
421                        (smtpmail-smtp-user . "abhojwani22@nobles.edu")
422                        (smtpmail-smtp-server . "smtp.gmail.com")))
423              ,(make-mu4e-context
424                :name "personal"
425                :enter-func (lambda () (mu4e-message "Entering personal context"))
426                :leave-func (lambda () (mu4e-message "Leaving personal context"))
427                :match-func (lambda (msg)
428                              (when msg
429                                (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
430                :vars '((mu4e-sent-folder . "/personal/Sent")
431                        (mu4e-drafts-folder . "/personal/Drafts")
432                        (mu4e-trash-folder . "/personal/Trash")
433                        (mu4e-refile-folder . "/personal/Archive")
434                        (user-mail-address . "me@armaanb.net")
435                        (message-cite-reply-position . below)
436                        (smtpmail-smtp-user . "me@armaanb.net")
437                        (smtpmail-smtp-server . "smtp.mailbox.org")))))
438     (add-to-list 'mu4e-bookmarks
439                  '(:name "Unified inbox"
440                          :query "maildir:\"/personal/Inbox\" or maildir:\"/school/Inbox\""
441                          :key ?b))
442     :hook ((mu4e-compose-mode . flyspell-mode)
443            (message-send-hook . (lambda () (unless (yes-or-no-p "Ya sure 'bout that?")
444                                              (signal 'quit nil))))))
445 #+end_src
446 **** Discourage Gnus from displaying HTML emails
447 #+begin_src emacs-lisp
448   (with-eval-after-load "mm-decode"
449     (add-to-list 'mm-discouraged-alternatives "text/html")
450     (add-to-list 'mm-discouraged-alternatives "text/richtext"))
451 #+end_src
452 ** Default browser
453 Set EWW as default browser except for multimedia which should open in MPV.
454 #+begin_src emacs-lisp
455   (defun browse-url-mpv (url &optional new-window)
456     "Ask MPV to load URL."
457     (interactive)
458     (start-process "mpv" "*mpv*" "mpv" url))
459
460   (setq browse-url-handlers
461         (quote
462          (("youtu\\.?be" . browse-url-mpv)
463           ("peertube.*" . browse-url-mpv)
464           ("vid.*" . browse-url-mpv)
465           ("vid.*" . browse-url-mpv)
466           ("*.mp4" . browse-url-mpv)
467           ("*.mp3" . browse-url-mpv)
468           ("*.ogg" . browse-url-mpv)
469           ("." . eww-browse-url)
470           )))
471 #+end_src
472 ** EWW
473 Some EWW enhancements.
474 *** Give buffer a useful name
475 #+begin_src emacs-lisp
476   ;; From https://protesilaos.com/dotemacs/
477   (defun prot-eww--rename-buffer ()
478     "Rename EWW buffer using page title or URL.
479         To be used by `eww-after-render-hook'."
480     (let ((name (if (eq "" (plist-get eww-data :title))
481                     (plist-get eww-data :url)
482                   (plist-get eww-data :title))))
483       (rename-buffer (format "*%s # eww*" name) t)))
484
485   (use-package eww
486     :straight (:type built-in)
487     :bind (("C-c w" . eww))
488     :hook (eww-after-render-hook prot-eww--rename-buffer))
489 #+end_src
490 *** Keybinding
491 #+begin_src emacs-lisp
492   (global-set-key (kbd "C-c w") 'eww)
493 #+end_src
494 ** IRC
495 Circe is a really nice IRC client that claims to be above RCIRC and below ERC in terms of features. ERC felt a bit messy and finicky to me, and Circe has all the features that I need. This setup gets the password for my bouncer (Pounce) instances via my =~/.authinfo.gpg= file.
496 #+begin_src emacs-lisp
497   (defun fetch-password (&rest params)
498     (require 'auth-source)
499     (let ((match (car (apply 'auth-source-search params))))
500       (if match
501           (let ((secret (plist-get match :secret)))
502             (if (functionp secret)
503                 (funcall secret)
504               secret))
505         (error "Password not found for %S" params))))
506
507   (use-package circe
508     :config
509     (enable-lui-track)
510     (enable-circe-color-nicks)
511     (setq circe-network-defaults '(("libera"
512                                     :host "irc.armaanb.net"
513                                     :nick "emacs"
514                                     :user "emacs"
515                                     :use-tls t
516                                     :port 6698
517                                     :pass (lambda (null) (fetch-password
518                                                           :login "emacs"
519                                                           :machine "irc.armaanb.net"
520                                                           :port 6698)))
521                                    ("oftc"
522                                     :host "irc.armaanb.net"
523                                     :nick "emacs"
524                                     :user "emacs"
525                                     :use-tls t
526                                     :port 6699
527                                     :pass (lambda (null) (fetch-password
528                                                           :login "emacs"
529                                                           :machine "irc.armaanb.net"
530                                                           :port 6699)))
531                                    ("tilde"
532                                     :host "irc.armaanb.net"
533                                     :nick "emacs"
534                                     :user "emacs"
535                                     :use-tls t
536                                     :port 6696
537                                     :pass (lambda (null) (fetch-password
538                                                           :login "emacs"
539                                                           :machine "irc.armaanb.net"
540                                                           :port 6696)))))
541     :custom (circe-default-part-message "goodbye!")
542     :bind (:map circe-mode-map ("C-c C-r" . circe-reconnect-all)))
543
544   (defun acheam-irc ()
545     "Open circe"
546     (interactive)
547     (if (get-buffer "irc.armaanb.net:6696")
548         (switch-to-buffer "irc.armaanb.net:6696")
549       (progn (switch-to-buffer "*scratch*")
550              (circe "libera")
551              (circe "oftc")
552              (circe "tilde"))))
553
554   (global-set-key (kbd "C-c i") 'acheam-irc)
555 #+end_src
556 ** Calendar
557 Still experimenting with this setup. Not sure if I will keep it, but it works well for seeing my calendar events. I use =vdirsyncer= to sync my calendar events which I'm really not happy with.
558 #+begin_src emacs-lisp
559   (defun sync-calendar ()
560     "Sync calendars with vdirsyncer"
561     (interactive)
562     (async-shell-command "vdirsyncer sync"))
563
564   (use-package calfw
565     :bind (:map cfw:calendar-mode-map ("C-S-u" . sync-calendar)))
566   (use-package calfw-ical)
567   (use-package calfw-org)
568
569   (defun acheam-calendar ()
570     "Open calendars"
571     (interactive)
572     (cfw:open-calendar-buffer
573      :contents-sources (list
574                         (cfw:org-create-source "Green")
575                         (cfw:ical-create-source
576                          "Personal"
577                          "~/.local/share/vdirsyncer/mailbox/Y2FsOi8vMC8zMQ.ics"
578                          "Gray")
579                         (cfw:ical-create-source
580                          "Personal"
581                          "~/.local/share/vdirsyncer/mailbox/Y2FsOi8vMC8zMQ.ics"
582                          "Red")
583                         (cfw:ical-create-source
584                          "School"
585                          "~/.local/share/vdirsyncer/school/abhojwani22@nobles.edu.ics"
586                          "Cyan"))
587      :view 'week))
588
589   (global-set-key (kbd "C-c c") 'acheam-calendar)
590 #+end_src
591 ** PDF reader
592 #+begin_src emacs-lisp
593   (use-package pdf-tools
594     :hook (pdf-view-mode . pdf-view-midnight-minor-mode))
595 #+end_src
596 * Emacs IDE
597 ** Python formatting
598 #+begin_src emacs-lisp
599   (use-package blacken
600     :hook (python-mode . blacken-mode)
601     :custom (blacken-line-length 79))
602
603 #+end_src
604 ** Strip trailing whitespace
605 #+begin_src emacs-lisp
606   (use-package ws-butler
607     :config (ws-butler-global-mode))
608 #+end_src
609 ** Flycheck
610 Automatic linting. I need to look into configuring this more.
611 #+begin_src emacs-lisp
612   (use-package flycheck
613     :config (global-flycheck-mode))
614 #+end_src
615 ** Project management
616 I never use this, but apparently its very powerful. Another item on my todo list.
617 #+begin_src emacs-lisp
618   (use-package projectile
619     :config (projectile-mode)
620     :custom ((projectile-completion-system 'ivy))
621     :bind-keymap ("C-c p" . projectile-command-map)
622     :init (setq projectile-switch-project-action #'projectile-dired))
623
624   (use-package counsel-projectile
625     :after projectile
626     :config (counsel-projectile-mode))
627 #+end_src
628 ** Dired
629 The best file manager!
630 #+begin_src emacs-lisp
631   (use-package dired
632     :straight (:type built-in)
633     :commands (dired dired-jump)
634     :custom ((dired-listing-switches "-agho --group-directories-first"))
635     :config (evil-collection-define-key 'normal 'dired-mode-map
636               "h" 'dired-single-up-directory
637               "l" 'dired-single-buffer))
638
639   (use-package dired-single
640     :commands (dired dired-jump))
641
642   (use-package dired-open
643     :commands (dired dired-jump)
644     :custom (dired-open-extensions '(("png" . "feh")
645                                      ("mkv" . "mpv"))))
646
647   (use-package dired-hide-dotfiles
648     :hook (dired-mode . dired-hide-dotfiles-mode)
649     :config
650     (evil-collection-define-key 'normal 'dired-mode-map
651       "H" 'dired-hide-dotfiles-mode))
652 #+end_src
653 ** Git
654 *** Magit
655 A very good Git interface.
656 #+begin_src emacs-lisp
657   (use-package magit)
658 #+end_src
659 *** Email
660 #+begin_src emacs-lisp
661   (use-package piem)
662   ;; (use-package git-email
663   ;;   :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
664   ;;   :config (git-email-piem-mode))
665 #+end_src
666 ** C
667 Modified from https://eklitzke.org/smarter-emacs-clang-format.
668
669 Style is basically ddevault's style guide but with 4 spaces instead of 8 char tabs.
670 #+begin_src emacs-lisp
671   (use-package clang-format
672     :custom (clang-format-style "{
673         BasedOnStyle: llvm,
674         AlwaysBreakAfterReturnType: AllDefinitions,
675         IndentWidth: 4,
676         }"))
677
678   (defun clang-format-buffer-smart ()
679     "Reformat buffer if .clang-format exists in the projectile root."
680     (when (file-exists-p (expand-file-name ".clang-format" (projectile-project-root)))
681       (when (if (eq major-mode 'c-mode))
682         (message "Formatting with clang-format...")
683         (clang-format-buffer))))
684
685   (add-hook 'before-save-hook 'clang-format-buffer-smart nil)
686 #+end_src
687 * General text editing
688 ** Spell checking
689 Spell check in text mode, and in prog-mode comments.
690 #+begin_src emacs-lisp
691   (dolist (hook '(text-mode-hook
692                   markdown-mode-hook
693                   scdoc-mode-hook))
694     (add-hook hook (lambda () (flyspell-mode))))
695   (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
696     (add-hook hook (lambda () (flyspell-mode -1))))
697   (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
698   (setq ispell-silently-savep t)
699 #+end_src
700 ** Sane tab width
701 #+begin_src emacs-lisp
702   (setq-default tab-width 2)
703 #+end_src
704 ** Save place
705 Opens file where you left it.
706 #+begin_src emacs-lisp
707   (save-place-mode)
708 #+end_src
709 ** Writing mode
710 Distraction free writing a la junegunn/goyo.
711 #+begin_src emacs-lisp
712   (use-package olivetti
713     :bind ("C-c o" . olivetti-mode))
714 #+end_src
715 ** Abbreviations
716 Abbreviate things! I just use this for things like my email address and copyright notice.
717 #+begin_src emacs-lisp
718   (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
719   (setq save-abbrevs 'silent)
720   (setq-default abbrev-mode t)
721 #+end_src
722 ** TRAMP
723 #+begin_src emacs-lisp
724   (setq tramp-default-method "ssh")
725 #+end_src
726 ** Follow version controlled symlinks
727 #+begin_src emacs-lisp
728   (setq vc-follow-symlinks t)
729 #+end_src
730 ** Open file as root
731 #+begin_src emacs-lisp
732   (defun doas-edit (&optional arg)
733     "Edit currently visited file as root.
734
735     With a prefix ARG prompt for a file to visit.
736     Will also prompt for a file to visit if current
737     buffer is not visiting a file.
738
739     Modified from Emacs Redux."
740     (interactive "P")
741     (if (or arg (not buffer-file-name))
742         (find-file (concat "/doas:root@localhost:"
743                            (ido-read-file-name "Find file(as root): ")))
744       (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
745
746     (global-set-key (kbd "C-x C-r") #'doas-edit)
747 #+end_src
748 ** Markdown mode
749 #+begin_src emacs-lisp
750   (use-package markdown-mode)
751 #+end_src
752 ** scdoc mode
753 Get it for yourself at https://git.armaanb.net/scdoc
754 #+begin_src emacs-lisp
755   (add-to-list 'load-path "~/src/scdoc-mode")
756   (autoload 'scdoc-mode "scdoc-mode" "Major mode for editing scdoc files" t)
757   (add-to-list 'auto-mode-alist '("\\.scd\\'" . scdoc-mode))
758 #+end_src
759 * Keybindings
760 ** Switch windows
761 #+begin_src emacs-lisp
762   (use-package ace-window
763     :bind ("M-o" . ace-window))
764 #+end_src
765 ** Kill current buffer
766 Makes "C-x k" binding faster.
767 #+begin_src emacs-lisp
768   (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
769 #+end_src
770 * Other settings
771 ** OpenSCAD syntax
772 #+begin_src emacs-lisp
773   (use-package scad-mode)
774 #+end_src
775 ** Control backup and lock files
776 Stop backup files from spewing everywhere.
777 #+begin_src emacs-lisp
778   (setq backup-directory-alist `(("." . "~/.emacs.d/backups"))
779         create-lockfiles nil)
780 #+end_src
781 ** Make yes/no easier
782 #+begin_src emacs-lisp
783   (defalias 'yes-or-no-p 'y-or-n-p)
784 #+end_src
785 ** Move customize file
786 No more clogging up init.el.
787 #+begin_src emacs-lisp
788   (setq custom-file "~/.emacs.d/custom.el")
789   (load custom-file)
790 #+end_src
791 ** Better help
792 #+begin_src emacs-lisp
793   (use-package helpful
794     :commands (helpful-callable helpful-variable helpful-command helpful-key)
795     :custom
796     (counsel-describe-function-function #'helpful-callable)
797     (counsel-describe-variable-function #'helpful-variable)
798     :bind
799     ([remap describe-function] . counsel-describe-function)
800     ([remap describe-command] . helpful-command)
801     ([remap describe-variable] . counsel-describe-variable)
802     ([remap describe-key] . helpful-key))
803 #+end_src
804 ** GPG
805 #+begin_src emacs-lisp
806   (use-package epa-file
807     :straight (:type built-in)
808     :custom
809     (epa-file-select-keys nil)
810     (epa-file-encrypt-to '("me@armaanb.net"))
811     (password-cache-expiry (* 60 15)))
812
813   (use-package pinentry
814     :config (pinentry-start))
815 #+end_src
816 ** Pastebin
817 #+begin_src emacs-lisp
818   (use-package 0x0
819     :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
820     :custom (0x0-default-service 'envs))
821 #+end_src
822 *** TODO Replace this with uploading to my own server
823 Similar to the ufile alias in my ashrc
824 ** Automatically clean buffers
825 Automatically close unused buffers (except those of Circe) at midnight.
826 #+begin_src emacs-lisp
827   (midnight-mode)
828   (add-to-list 'clean-buffer-list-kill-never-regexps
829                (lambda (buffer-name)
830                  (with-current-buffer buffer-name
831                    (derived-mode-p 'lui-mode))))
832 #+end_src
833 * Tangles
834 ** Spectrwm
835 Spectrwm is a really awesome window manager! Would highly recommend.
836 *** General settings
837 #+begin_src conf :tangle ~/.spectrwm.conf
838   workspace_limit = 5
839   warp_pointer = 1
840   modkey = Mod4
841   autorun = ws[1]:/home/armaa/src/bin/autostart
842 #+end_src
843 *** Bar
844 Disable the bar by default (it can still be brought back up with MOD+b). The font just needs to be set to something that you have installed, otherwise spectrwm won't launch.
845 #+begin_src conf :tangle ~/.spectrwm.conf
846   bar_enabled = 0
847   bar_font = xos4 JetBrains Mono:pixelsize=14:antialias=true # any installed font
848 #+end_src
849 *** Keybindings
850 I'm not a huge fan of how spectrwm handles keybindings, probably my biggest gripe with it.
851 **** WM actions
852 #+begin_src conf :tangle ~/.spectrwm.conf
853   program[term] = st -e tmux
854   program[notif] = /home/armaa/src/bin/setter status
855   program[pass] = /home/armaa/src/bin/passmenu
856   program[lock] = slock
857
858   bind[notif] = MOD+n
859   bind[pass] = MOD+Shift+p
860 #+end_src
861 **** Media keys
862 #+begin_src conf :tangle ~/.spectrwm.conf
863   program[paup] = /home/armaa/src/bin/setter audio +5
864   program[padown] = /home/armaa/src/bin/setter audio -5
865   program[pamute] = /home/armaa/src/bin/setter audio
866   program[brigup] = /home/armaa/src/bin/setter brightness +10%
867   program[brigdown] = /home/armaa/src/bin/setter brightness 10%-
868
869   bind[padown] = XF86AudioLowerVolume
870   bind[paup] = XF86AudioRaiseVolume
871   bind[pamute] = XF86AudioMute
872   bind[brigdown] = XF86MonBrightnessDown
873   bind[brigup] = XF86MonBrightnessUp
874 #+end_src
875 **** HJKL
876 #+begin_src conf :tangle ~/.spectrwm.conf
877   program[h] = xdotool keyup h key --clearmodifiers Left
878   program[j] = xdotool keyup j key --clearmodifiers Down
879   program[k] = xdotool keyup k key --clearmodifiers Up
880   program[l] = xdotool keyup l key --clearmodifiers Right
881
882   bind[h] = MOD + Control + h
883   bind[j] = MOD + Control + j
884   bind[k] = MOD + Control + k
885   bind[l] = MOD + Control + l
886 #+end_src
887 **** Programs
888 #+begin_src conf :tangle ~/.spectrwm.conf
889   program[email] = emacsclient -ce '(progn (switch-to-buffer "*scratch*") (mu4e))'
890   program[irc] = emacsclient -ce '(acheam-irc)'
891   program[rss] = emacsclient -ce '(elfeed)'
892   program[calendar] = emacsclient -ce '(acheam-calendar)'
893   program[calc] = emacsclient -ce '(progn (calc) (windmove-up) (delete-window))'
894   program[emacs] = emacsclient -c
895   program[bookmarks] = /home/armaa/src/bin/bookmarks
896   program[browser] = chorizo
897
898   bind[email] = MOD+Control+1
899   bind[irc] = MOD+Control+2
900   bind[rss] = MOD+Control+3
901   bind[calendar] = MOD+Control+4
902   bind[calc] = MOD+Control+5
903   bind[emacs] = MOD+Control+Return
904   bind[bookmarks] = MOD+Control+o
905   bind[browser] = MOD+Control+p
906 #+end_src
907 *** Quirks
908 Float some specific programs by default.
909 #+begin_src conf :tangle ~/.spectrwm.conf
910   quirk[Castle Menu] = FLOAT
911   quirk[momen] = FLOAT
912   quirk[pinentry-fltk] = FLOAT
913 #+end_src
914 ** Ash
915 *** Options
916 Use the vi editing mode. I still haven't found a good way to show visual feedback of the current mode. Ideally the cursor would change to a beam when in insert mode, and a box when in normal mode.
917 #+begin_src conf :tangle ~/.config/ash/ashrc
918   set -o vi
919 #+end_src
920 *** Functions
921 **** Finger
922 #+begin_src shell :tangle ~/.config/ash/ashrc
923   finger() {
924       user=$(echo "$1" | cut -f 1 -d '@')
925       host=$(echo "$1" | cut -f 2 -d '@')
926       echo $user | nc "$host" 79
927   }
928 #+end_src
929 **** Upload to ftp.armaanb.net
930 #+begin_src shell :tangle ~/.config/ash/ashrc
931   _uprint() {
932       echo "https://l.armaanb.net/$(basename "$1")" | tee /dev/tty | xclip -sel c
933   }
934
935   _uup() {
936       rsync "$1" "armaa@armaanb.net:/srv/ftp/pub/$2" --chmod 644 --progress
937   }
938
939   ufile() {
940       _uup "$1" "$2"
941       _uprint "$1"
942   }
943
944   uclip() {
945       tmp=$(mktemp)
946       xclip -o -sel c >> "$tmp"
947       basetmp=$(echo "$tmp" | tail -c +5)
948       _uup "$tmp" "$basetmp"
949       _uprint "$basetmp"
950       rm -f "$tmp"
951   }
952 #+end_src
953 *** Exports
954 **** Default programs
955 #+begin_src shell :tangle ~/.config/ash/ashrc
956   export EDITOR="emacsclient -c"
957   export VISUAL="$EDITOR"
958   export TERM=xterm-256color # for compatability
959   #+end_src
960 **** General program configs
961 #+begin_src shell :tangle ~/.config/ash/ashrc
962   export GPG_TTY="$(tty)"
963   export MANPAGER='nvim +Man!'
964   export PAGER='less'
965   export GTK_USE_PORTAL=1
966   export CDPATH=:~
967   export LESSHISTFILE=/dev/null
968   export PASH_KEYID=me@armaanb.net
969   export PASH_LENGTH=20
970 #+end_src
971 **** PATH
972 #+begin_src shell :tangle ~/.config/ash/ashrc
973   export PATH="/home/armaa/src/bin:$PATH"
974   export PATH="/home/armaa/src/bin/bin:$PATH"
975   export PATH="/home/armaa/.local/bin:$PATH"
976   export PATH="/usr/lib/ccache/bin:$PATH"
977 #+end_src
978 **** Locale
979 #+begin_src shell :tangle ~/.config/ash/ashrc
980   export LC_ALL="en_US.UTF-8"
981   export LC_CTYPE="en_US.UTF-8"
982   export LANGUAGE="en_US.UTF-8"
983   export TZ="America/New_York"
984 #+end_src
985 **** KISS
986 #+begin_src shell :tangle ~/.config/ash/ashrc
987   export KISS_PATH=""
988   export KISS_PATH="$KISS_PATH:$HOME/repos/personal"
989   export KISS_PATH="$KISS_PATH:$HOME/repos/bin/bin"
990   export KISS_PATH="$KISS_PATH:$HOME/repos/main/core"
991   export KISS_PATH="$KISS_PATH:$HOME/repos/main/extra"
992   export KISS_PATH="$KISS_PATH:$HOME/repos/main/xorg"
993   export KISS_PATH="$KISS_PATH:$HOME/repos/community/community"
994   export KISS_PATH="$KISS_PATH:$HOME/repos/mid/ports"
995 #+end_src
996 **** Compilation flags
997 #+begin_src shell :tangle ~/.config/ash/ashrc
998   export CFLAGS="-O3 -pipe -march=native"
999   export CXXFLAGS="$CFLAGS"
1000   export MAKEFLAGS="-j$(nproc)"
1001   export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig"
1002 #+end_src
1003 **** XDG desktop dirs
1004 #+begin_src shell :tangle ~/.config/ash/ashrc
1005   export XDG_DESKTOP_DIR="/dev/null"
1006   export XDG_DOCUMENTS_DIR="$HOME/documents"
1007   export XDG_DOWNLOAD_DIR="$HOME/downloads"
1008   export XDG_MUSIC_DIR="$HOME/music"
1009   export XDG_PICTURES_DIR="$HOME/pictures"
1010   export XDG_VIDEOS_DIR="$HOME/videos"
1011 #+end_src
1012 *** Aliases
1013 **** SSH
1014 #+begin_src shell :tangle ~/.config/ash/ashrc
1015   alias poki='ssh armaanb.net'
1016   alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
1017   alias union='ssh 192.168.1.18'
1018   alias mine='ssh -p 23 root@pickupserver.cc'
1019   alias tcf='ssh root@204.48.23.68'
1020   alias ngmun='ssh root@157.245.89.25'
1021   alias prox='ssh root@192.168.1.224'
1022   alias ncq='ssh root@143.198.123.17'
1023   alias envs='ssh acheam@envs.net'
1024 #+end_src
1025 **** File management
1026 #+begin_src shell :tangle ~/.config/ash/ashrc
1027   alias ls='LC_COLLATE=C ls -lh --group-directories-first'
1028   alias la='ls -A'
1029   alias df='df -h / /boot'
1030   alias du='du -h'
1031   alias free='free -m'
1032   alias cp='cp -riv'
1033   alias rm='rm -iv'
1034   alias mv='mv -iv'
1035   alias ln='ln -v'
1036   alias grep='grep -in'
1037   alias mkdir='mkdir -pv'
1038   alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar && rm lxc*'
1039   emacs() { $EDITOR "$@" & }
1040   alias vim="emacs"
1041 #+end_src
1042 **** System management
1043 #+begin_src shell :tangle ~/.config/ash/ashrc
1044   alias crontab='crontab-argh'
1045   alias sudo='doas'
1046   alias pasu='git -C ~/.password-store push'
1047   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1048     yadm push'
1049 #+end_src
1050 **** Networking
1051 #+begin_src shell :tangle ~/.config/ash/ashrc
1052   alias ping='ping -c 10'
1053   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1054   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1055   alias plan='T=$(mktemp) && \
1056           rsync armaanb.net:/home/armaa/plan.txt "$T" && \
1057           TT=$(mktemp) && \
1058           head -n -2 $T > $TT && \
1059           /bin/nvim $TT && \
1060           echo >> "$TT" && \
1061           echo "Last updated: $(date -R)" >> "$TT" && \
1062           fold -sw 72 "$TT" > "$T"| \
1063           rsync "$T" armaanb.net:/home/armaa/plan.txt && \
1064           rm -f "$T"'
1065 #+end_src
1066 **** Virtual machines, chroots
1067 #+begin_src shell :tangle ~/.config/ash/ashrc
1068   alias cwindows='qemu-system-x86_64 \
1069     -smp 3 \
1070     -cpu host \
1071     -enable-kvm \
1072     -m 3G \
1073     -device VGA,vgamem_mb=64 \
1074     -device intel-hda \
1075     -device hda-duplex \
1076     -net nic \
1077     -net user,smb=/home/armaa/public \
1078     -drive format=qcow2,file=/home/armaa/virtual/windows.qcow2'
1079 #+end_src
1080 **** Latin
1081 #+begin_src shell :tangle ~/.config/ash/ashrc
1082   alias words='gen-shell -c "words"'
1083   alias words-e='gen-shell -c "words ~E"'
1084 #+end_src
1085 **** Other
1086 #+begin_src shell :tangle ~/.config/ash/ashrc
1087   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1088     iflag=fullblock'
1089   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1090     iflag=fullblock'
1091   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
1092     --restrict-filenames -o '%(title)s.%(ext)s'"
1093   alias bc='bc -l'
1094 #+end_src
1095 ** MPV
1096 Make MPV play a little bit smoother.
1097 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1098   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1099   hwdec=auto-copy
1100 #+end_src
1101 ** Inputrc
1102 This file is used for any GNU Readline programs. I use Emacs editing mode mostly because of one annoyance which is that to clear the screen using ^L, you have to be in normal mode which is a pain. If there is a way to rebind this, I'd love to know!.
1103 #+begin_src conf :tangle ~/.inputrc
1104   set editing-mode emacs
1105 #+end_src
1106 ** Git
1107 *** User
1108 #+begin_src conf :tangle ~/.gitconfig
1109   [user]
1110   name = Armaan Bhojwani
1111   email = me@armaanb.net
1112   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1113 #+end_src
1114 *** Init
1115 #+begin_src conf :tangle ~/.gitconfig
1116   [init]
1117   defaultBranch = main
1118 #+end_src
1119 *** GPG
1120 #+begin_src conf :tangle ~/.gitconfig
1121   [gpg]
1122   program = gpg
1123 #+end_src
1124 *** Sendemail
1125 #+begin_src conf :tangle ~/.gitconfig
1126   [sendemail]
1127   smtpserver = smtp.mailbox.org
1128   smtpuser = me@armaanb.net
1129   smtpencryption = ssl
1130   smtpserverport = 465
1131   confirm = auto
1132 #+end_src
1133 *** Submodule
1134 #+begin_src conf :tangle ~/.gitconfig
1135   [submodule]
1136   recurse = true
1137 #+end_src
1138 *** Aliases
1139 #+begin_src conf :tangle ~/.gitconfig
1140   [alias]
1141   stat = diff --stat
1142   sclone = clone --depth 1
1143   sclean = clean -dfX
1144   a = add
1145   aa = add .
1146   c = commit
1147   quickfix = commit . --amend --no-edit
1148   p = push
1149   subup = submodule update --remote
1150   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1151   pushnc = push -o skip-ci
1152 #+end_src
1153 *** Commit
1154 #+begin_src conf :tangle ~/.gitconfig
1155   [commit]
1156   gpgsign = true
1157   verbose = true
1158 #+end_src
1159 *** Tag
1160 #+begin_src conf :tangle ~/.gitconfig
1161   [tag]
1162   gpgsign = true
1163 #+end_src
1164 ** Zathura
1165 The best document reader!
1166 *** Options
1167 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1168   map <C-i> recolor
1169   map <A-b> toggle_statusbar
1170   set selection-clipboard clipboard
1171   set scroll-step 200
1172
1173   set window-title-basename "true"
1174   set selection-clipboard "clipboard"
1175 #+end_src
1176 *** Colors
1177 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1178   set default-bg         "#000000"
1179   set default-fg         "#ffffff"
1180   set render-loading     true
1181   set render-loading-bg  "#000000"
1182   set render-loading-fg  "#ffffff"
1183
1184   set recolor-lightcolor "#000000" # bg
1185   set recolor-darkcolor  "#ffffff" # fg
1186   set recolor            "true"
1187 #+end_src
1188 ** Xresources
1189 Modus operandi theme. No program I use checks for anything beyond foreground and background, but hey, it can't hurt to have all the colors in there.
1190 #+begin_src conf :tangle ~/.Xresources
1191   ! special
1192   ,*.foreground:   #ffffff
1193   ,*.background:   #000000
1194   ,*.cursorColor:  #ffffff
1195
1196   ! black
1197   ,*.color0:       #000000
1198   ,*.color8:       #555555
1199
1200   ! red
1201   ,*.color1:       #ff8059
1202   ,*.color9:       #ffa0a0
1203
1204   ! green
1205   ,*.color2:       #00fc50
1206   ,*.color10:      #88cf88
1207
1208   ! yellow
1209   ,*.color3:       #eecc00
1210   ,*.color11:      #d2b580
1211
1212   ! blue
1213   ,*.color4:       #29aeff
1214   ,*.color12:      #92baff
1215
1216   ! magenta
1217   ,*.color5:       #feacd0
1218   ,*.color13:      #e0b2d6
1219
1220   ! cyan
1221   ,*.color6:       #00d3d0
1222   ,*.color14:      #a0bfdf
1223
1224   ! white
1225   ,*.color7:       #eeeeee
1226   ,*.color15:      #dddddd
1227 #+end_src
1228 ** Tmux
1229 I use tmux in order to keep my st build light. Still learning how it works.
1230 #+begin_src conf :tangle ~/.tmux.conf
1231   set -g status off
1232   set -g mouse on
1233
1234   set-option -g history-limit 50000
1235
1236   set -g set-titles on
1237   set -g set-titles-string "#W"
1238
1239   set-window-option -g mode-keys vi
1240   bind-key -T copy-mode-vi 'v' send -X begin-selection
1241   bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
1242 #+end_src
1243 ** GPG
1244 *** Config
1245 #+begin_src conf :tangle ~/.gnupg/gpg.conf
1246   default-key 3C9ED82FFE788E4A
1247   use-agent
1248 #+end_src
1249 *** Agent
1250 #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
1251   pinentry-program /sbin/pinentry
1252   max-cache-ttl 6000
1253   default-cache-ttl 6000
1254   allow-emacs-pinentry
1255 #+end_src
1256 ** Xmodmap
1257 #+begin_src conf :tangle (progn (if (string= (system-name) "frost.armaanb.net") "~/.config/xmodmap" "no"))
1258   ! Unmap left super
1259   clear mod4
1260
1261   ! Turn right alt into super
1262   remove mod1 = Alt_R
1263   add mod4 = Alt_R
1264
1265   ! Swap caps and control
1266   remove Lock = Caps_Lock
1267   remove Control = Control_L
1268   remove Lock = Control_L
1269   remove Control = Caps_Lock
1270   keysym Control_L = Caps_Lock
1271   keysym Caps_Lock = Control_L
1272   add Lock = Caps_Lock
1273   add Control = Control_L
1274 #+end_src
1275 ** sx
1276 #+begin_src shell :tangle ~/.config/sx/sxrc :tangle-mode (identity #o755)
1277   autostart &
1278   dwmsetroot &
1279   exec dwm
1280 #+end_src