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