]> git.armaanb.net Git - config.org.git/blob - config.org
Remove which-key
[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 28 with native compilation, 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 ** TODOs
17 *** TODO Turn keybinding and hook declarations into use-package declarations where possible
18 *** TODO Include offlineimap config
19 ** License
20 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.
21 * Package management
22 ** Bootstrap straight.el
23 straight.el is really nice for managing package, and it integrates nicely with use-package. It uses the bootstrapping system defined here for installation.
24 #+begin_src emacs-lisp
25   (defvar native-comp-deferred-compilation-deny-list ())
26   (defvar bootstrap-version)
27   (let ((bootstrap-file
28          (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
29         (bootstrap-version 5))
30     (unless (file-exists-p bootstrap-file)
31       (with-current-buffer
32           (url-retrieve-synchronously
33            "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
34            'silent 'inhibit-cookies)
35         (goto-char (point-max))
36         (eval-print-last-sexp)))
37     (load bootstrap-file nil 'nomessage))
38 #+end_src
39 ** Replace package.el with straight
40 #+begin_src emacs-lisp
41   (straight-use-package 'use-package)
42   (setq straight-use-package-by-default t)
43 #+end_src
44 * Visual options
45 ** Theme
46 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.
47 #+begin_src emacs-lisp
48   (setq modus-themes-slanted-constructs t
49         modus-themes-bold-constructs t
50         modus-themes-mode-line '3d
51         modus-themes-scale-headings t
52         modus-themes-diffs 'desaturated)
53   (load-theme 'modus-vivendi t)
54 #+end_src
55 ** Typography
56 *** Font
57 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]].
58 #+begin_src emacs-lisp
59   (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
60 #+end_src
61 *** Ligatures
62 #+begin_src emacs-lisp
63   (use-package ligature
64     :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
65     :config
66     (ligature-set-ligatures
67      '(prog-mode text-mode)
68      '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
69        "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
70        "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
71        "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
72        "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
73        ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
74        "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
75        "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
76        "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
77        "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
78        "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
79        "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
80     (global-ligature-mode t))
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 ** Ruler
118 Show a ruler at a certain number of chars depending on mode.
119 #+begin_src emacs-lisp
120   (setq display-fill-column-indicator-column 80)
121   (global-display-fill-column-indicator-mode)
122 #+end_src
123 ** Highlight todo items in comments
124 #+begin_src emacs-lisp
125   (use-package hl-todo
126     :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
127     :config (global-hl-todo-mode 1))
128 #+end_src
129 ** Blink cursor
130 #+begin_src emacs-lisp
131   (blink-cursor-mode)
132 #+end_src
133 ** Visual line mode
134 Soft wrap words and do operations by visual lines except in programming modes.
135 #+begin_src emacs-lisp
136   (global-visual-line-mode 1)
137   (dolist (hook '(prog-mode-hook
138                   calc-trail-mode-hook
139                   org-agenda-mode-hook
140                   mu4e-headers-mode-hook))
141     (add-hook hook (lambda () (visual-line-mode -1))))
142 #+end_src
143 ** Display number of matches in search
144 #+begin_src emacs-lisp
145   (use-package anzu
146     :config (global-anzu-mode))
147 #+end_src
148 ** Visual bell
149 Invert modeline color instead of audible bell or the standard visual bell.
150 #+begin_src emacs-lisp
151   (setq visible-bell nil
152         ring-bell-function
153         (lambda () (invert-face 'mode-line)
154           (run-with-timer 0.1 nil #'invert-face 'mode-line)))
155 #+end_src
156 * Evil mode
157 ** General
158 #+begin_src emacs-lisp
159   (use-package evil
160     :custom (select-enable-clipboard nil)
161     :config
162     (evil-mode)
163     (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
164     ;; Use visual line motions even outside of visual-line-mode buffers
165     (evil-global-set-key 'motion "j" 'evil-next-visual-line)
166     (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
167     (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
168 #+end_src
169 ** Evil collection
170 Evil bindings for tons of packages.
171 #+begin_src emacs-lisp
172   (use-package evil-collection
173     :after evil
174     :init (evil-collection-init)
175     :custom (evil-collection-setup-minibuffer t))
176 #+end_src
177 ** Surround
178 tpope prevails!
179 #+begin_src emacs-lisp
180   (use-package evil-surround
181     :config (global-evil-surround-mode))
182 #+end_src
183 ** Nerd commenter
184 Makes commenting super easy
185 #+begin_src emacs-lisp
186   (use-package evil-nerd-commenter
187     :bind (:map evil-normal-state-map
188                 ("gc" . evilnc-comment-or-uncomment-lines))
189     :custom (evilnc-invert-comment-line-by-line nil))
190 #+end_src
191 ** Undo redo
192 Fix the oopsies!
193 #+begin_src emacs-lisp
194   (evil-set-undo-system 'undo-redo)
195 #+end_src
196 ** Number incrementing
197 Add back C-a/C-x bindings.
198 #+begin_src emacs-lisp
199   (use-package evil-numbers
200     :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
201     :bind (:map evil-normal-state-map
202                 ("C-M-a" . evil-numbers/inc-at-pt)
203                 ("C-M-x" . evil-numbers/dec-at-pt)))
204 #+end_src
205 ** Evil org
206 #+begin_src emacs-lisp
207   (use-package evil-org
208     :after org
209     :hook (org-mode . evil-org-mode)
210     :config
211     (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
212
213   (use-package evil-org-agenda
214     :straight (:type built-in)
215     :after evil-org
216     :config (evil-org-agenda-set-keys))
217 #+end_src
218 * Org mode
219 ** General
220 #+begin_src emacs-lisp
221   (use-package org
222     :straight (:type built-in)
223     :commands (org-capture org-agenda)
224     :custom
225     (org-ellipsis " â–¾")
226     (org-agenda-start-with-log-mode t)
227     (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
228     (org-log-done 'time)
229     (org-log-into-drawer t)
230     (org-src-tab-acts-natively t)
231     (org-src-fontify-natively t)
232     (org-startup-indented t)
233     (org-hide-emphasis-markers t)
234     (org-fontify-whole-block-delimiter-line nil)
235     :bind ("C-c a" . org-agenda))
236 #+end_src
237 ** Tempo
238 Define templates for lots of common structure elements. Mostly just used within this file.
239 #+begin_src emacs-lisp
240   (use-package org-tempo
241     :after org
242     :straight (:type built-in)
243     :config
244     ;; TODO: There's gotta be a more efficient way to write this
245     (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
246     (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
247     (add-to-list 'org-structure-template-alist '("ash" . "src shell :tangle ~/.config/ash/ashrc"))
248     (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
249     (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
250     (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
251     (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
252     (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
253     (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
254     (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources"))
255     (add-to-list 'org-structure-template-alist '("tm" . "src conf :tangle ~/.tmux.conf"))
256     (add-to-list 'org-structure-template-alist '("gp" . "src conf :tangle ~/.gnupg/gpg.conf"))
257     (add-to-list 'org-structure-template-alist '("ag" . "src conf :tangle ~/.gnupg/gpg-agent.conf")))
258 #+end_src
259 * Autocompletion
260 ** Ivy
261 A well balanced completion framework.
262 #+begin_src emacs-lisp
263   (use-package ivy
264     :bind (("C-s" . swiper)
265            :map ivy-minibuffer-map
266            ("TAB" . ivy-alt-done)
267            :map ivy-switch-buffer-map
268            ("M-d" . ivy-switch-buffer-kill))
269     :config (ivy-mode))
270 #+end_src
271 ** Ivy-rich
272 #+begin_src emacs-lisp
273   (use-package ivy-rich
274     :after (ivy counsel)
275     :config (ivy-rich-mode))
276 #+end_src
277 ** Counsel
278 Ivy everywhere.
279 #+begin_src emacs-lisp
280   (use-package counsel
281     :bind (("C-M-j" . 'counsel-switch-buffer)
282            :map minibuffer-local-map
283            ("C-r" . 'counsel-minibuffer-history))
284     :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
285     :config (counsel-mode))
286 #+end_src
287 ** Remember frequent commands
288 #+begin_src emacs-lisp
289   (use-package ivy-prescient
290     :after counsel
291     :custom (ivy-prescient-enable-filtering nil)
292     :config
293     (prescient-persist-mode)
294     (ivy-prescient-mode))
295 #+end_src
296 ** Swiper
297 Better search utility.
298 #+begin_src emacs-lisp
299   (use-package swiper)
300 #+end_src
301 * Emacs OS
302 ** RSS
303 Use elfeed for reading RSS. I have another file with all the feeds in it that I'd rather keep private.
304 #+begin_src emacs-lisp
305   (use-package elfeed
306     :bind (("C-c e" . elfeed))
307     :config
308     (load "~/.emacs.d/feeds.el")
309     (add-hook 'elfeed-new-entry-hook
310               (elfeed-make-tagger :feed-url "youtube\\.com"
311                                   :add '(youtube)))
312     :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
313
314   (use-package elfeed-goodies
315     :after elfeed
316     :config (elfeed-goodies/setup))
317 #+end_src
318 ** Email
319 Use mu4e for reading emails.
320
321 I use `offlineimap` to sync my maildirs. It is slower than mbsync, but is fast enough for me, especially when ran with the =-q= option.
322
323 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.
324 #+begin_src emacs-lisp
325   (use-package smtpmail
326     :straight (:type built-in))
327   (use-package mu4e
328     :load-path "/usr/share/emacs/site-lisp/mu4e"
329     :straight (:build nil)
330     :bind (("C-c m" . mu4e))
331     :config
332     (setq user-full-name "Armaan Bhojwani"
333           smtpmail-local-domain "armaanb.net"
334           smtpmail-stream-type 'ssl
335           smtpmail-smtp-service '465
336           mu4e-change-filenames-when-moving t
337           mu4e-get-mail-command "offlineimap -q"
338           message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
339           message-citation-line-function 'message-insert-formatted-citation-line
340           mu4e-completing-read-function 'ivy-completing-read
341           mu4e-confirm-quit nil
342           mu4e-view-use-gnus t
343           mail-user-agent 'mu4e-user-agent
344           mail-context-policy 'pick-first
345           mu4e-contexts
346           `( ,(make-mu4e-context
347                :name "school"
348                :enter-func (lambda () (mu4e-message "Entering school context"))
349                :leave-func (lambda () (mu4e-message "Leaving school context"))
350                :match-func (lambda (msg)
351                              (when msg
352                                (string-match-p "^/school" (mu4e-message-field msg :maildir))))
353                :vars '((user-mail-address . "abhojwani22@nobles.edu")
354                        (mu4e-sent-folder . "/school/Sent")
355                        (mu4e-drafts-folder . "/school/Drafts")
356                        (mu4e-trash-folder . "/school/Trash")
357                        (mu4e-refile-folder . "/school/Archive")
358                        (message-cite-reply-position . above)
359                        (user-mail-address . "abhojwani22@nobles.edu")
360                        (smtpmail-smtp-user . "abhojwani22@nobles.edu")
361                        (smtpmail-smtp-server . "smtp.gmail.com")))
362              ,(make-mu4e-context
363                :name "personal"
364                :enter-func (lambda () (mu4e-message "Entering personal context"))
365                :leave-func (lambda () (mu4e-message "Leaving personal context"))
366                :match-func (lambda (msg)
367                              (when msg
368                                (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
369                :vars '((mu4e-sent-folder . "/personal/Sent")
370                        (mu4e-drafts-folder . "/personal/Drafts")
371                        (mu4e-trash-folder . "/personal/Trash")
372                        (mu4e-refile-folder . "/personal/Archive")
373                        (user-mail-address . "me@armaanb.net")
374                        (message-cite-reply-position . below)
375                        (smtpmail-smtp-user . "me@armaanb.net")
376                        (smtpmail-smtp-server . "smtp.mailbox.org")))))
377     (add-to-list 'mu4e-bookmarks
378                  '(:name "Unified inbox"
379                          :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
380                          :key ?b))
381     :hook ((mu4e-compose-mode . flyspell-mode)
382            (mu4e-compose-mode . auto-fill-mode)
383            (mu4e-view-mode-hook . turn-on-visual-line-mode)
384            (message-send-hook . (lambda () (unless (yes-or-no-p "Ya sure 'bout that?")
385                                              (signal 'quit nil))))))
386 #+end_src
387 Discourage Gnus from displaying HTML emails
388 #+begin_src emacs-lisp
389   (with-eval-after-load "mm-decode"
390     (add-to-list 'mm-discouraged-alternatives "text/html")
391     (add-to-list 'mm-discouraged-alternatives "text/richtext"))
392 #+end_src
393 ** Default browser
394 Set EWW as default browser except for multimedia which should open in MPV.
395 #+begin_src emacs-lisp
396   (defun browse-url-mpv (url &optional new-window)
397     "Open URL in MPV."
398     (interactive)
399     (start-process "mpv" "*mpv*" "mpv" url))
400
401   (setq browse-url-handlers
402         (quote
403          (("youtu\\.?be" . browse-url-mpv)
404           ("peertube.*" . browse-url-mpv)
405           ("vid.*" . browse-url-mpv)
406           ("vid.*" . browse-url-mpv)
407           ("*.mp4" . browse-url-mpv)
408           ("*.mp3" . browse-url-mpv)
409           ("*.ogg" . browse-url-mpv)
410           ("." . eww-browse-url)
411           )))
412 #+end_src
413 ** EWW
414 Some EWW enhancements.
415 *** Give buffer a useful name
416 #+begin_src emacs-lisp
417   ;; From https://protesilaos.com/dotemacs/
418   (defun prot-eww--rename-buffer ()
419     "Rename EWW buffer using page title or URL.
420         To be used by `eww-after-render-hook'."
421     (let ((name (if (eq "" (plist-get eww-data :title))
422                     (plist-get eww-data :url)
423                   (plist-get eww-data :title))))
424       (rename-buffer (format "*%s # eww*" name) t)))
425
426   (use-package eww
427     :straight (:type built-in)
428     :bind (("C-c w" . eww))
429     :hook (eww-after-render-hook prot-eww--rename-buffer))
430 #+end_src
431 *** Keybinding
432 #+begin_src emacs-lisp
433   (global-set-key (kbd "C-c w") 'eww)
434 #+end_src
435 ** IRC
436 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.
437 #+begin_src emacs-lisp
438   (defun fetch-password (&rest params)
439     (require 'auth-source)
440     (let ((match (car (apply 'auth-source-search params))))
441       (if match
442           (let ((secret (plist-get match :secret)))
443             (if (functionp secret)
444                 (funcall secret)
445               secret))
446         (error "Password not found for %S" params))))
447
448   (use-package circe
449     :config
450     (enable-lui-track)
451     (enable-circe-color-nicks)
452     (setq circe-network-defaults '(("libera"
453                                     :host "irc.armaanb.net"
454                                     :nick "emacs"
455                                     :user "emacs"
456                                     :use-tls t
457                                     :port 6698
458                                     :pass (lambda (null) (fetch-password
459                                                           :login "emacs"
460                                                           :machine "irc.armaanb.net"
461                                                           :port 6698)))
462                                    ("oftc"
463                                     :host "irc.armaanb.net"
464                                     :nick "emacs"
465                                     :user "emacs"
466                                     :use-tls t
467                                     :port 6699
468                                     :pass (lambda (null) (fetch-password
469                                                           :login "emacs"
470                                                           :machine "irc.armaanb.net"
471                                                           :port 6699)))
472                                    ("tilde"
473                                     :host "irc.armaanb.net"
474                                     :nick "emacs"
475                                     :user "emacs"
476                                     :use-tls t
477                                     :port 6696
478                                     :pass (lambda (null) (fetch-password
479                                                           :login "emacs"
480                                                           :machine "irc.armaanb.net"
481                                                           :port 6696)))
482                                    (circe "libera")
483                                    (circe "oftc")
484                                    (circe "tilde")))
485     :custom (circe-default-part-message "goodbye!")
486     :bind (:map circe-mode-map ("C-c C-r" . circe-reconnect-all)))
487 #+end_src
488 ** Calendar
489 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.
490 #+begin_src emacs-lisp
491   (defun sync-calendar ()
492     "Sync calendars with vdirsyncer"
493     (interactive)
494     (async-shell-command "vdirsyncer sync"))
495
496   (use-package calfw
497     :bind (:map cfw:calendar-mode-map ("C-S-u" . sync-calendar)))
498   (use-package calfw-ical)
499   (use-package calfw-org)
500
501   (defun acheam-calendar ()
502     "Open calendars"
503     (interactive)
504     (cfw:open-calendar-buffer
505      :contents-sources (list
506                         (cfw:org-create-source "Green")
507                         (cfw:ical-create-source
508                          "Personal"
509                          "~/.local/share/vdirsyncer/mailbox/Y2FsOi8vMC8zMQ.ics"
510                          "Gray")
511                         (cfw:ical-create-source
512                          "Personal"
513                          "~/.local/share/vdirsyncer/mailbox/Y2FsOi8vMC8zMQ.ics"
514                          "Red")
515                         (cfw:ical-create-source
516                          "School"
517                          "~/.local/share/vdirsyncer/school/abhojwani22@nobles.edu.ics"
518                          "Cyan"))
519      :view 'week))
520
521   (global-set-key (kbd "C-c c") 'acheam-calendar)
522 #+end_src
523 ** PDF reader
524 #+begin_src emacs-lisp
525   (use-package pdf-tools
526     :hook (pdf-view-mode . pdf-view-midnight-minor-mode))
527 #+end_src
528 * Emacs IDE
529 ** Python formatting
530 #+begin_src emacs-lisp
531   (use-package blacken
532     :hook (python-mode . blacken-mode)
533     :custom (blacken-line-length 79))
534
535 #+end_src
536 ** Strip trailing whitespace
537 #+begin_src emacs-lisp
538   (use-package ws-butler
539     :config (ws-butler-global-mode))
540 #+end_src
541 ** Flycheck
542 Automatic linting. I need to look into configuring this more.
543 #+begin_src emacs-lisp
544   (use-package flycheck
545     :config (global-flycheck-mode))
546 #+end_src
547 ** Project management
548 I never use this, but apparently its very powerful. Another item on my todo list.
549 #+begin_src emacs-lisp
550   (use-package projectile
551     :config (projectile-mode)
552     :custom ((projectile-completion-system 'ivy))
553     :bind-keymap
554     ("C-c p" . projectile-command-map)
555     :init
556     (when (file-directory-p "~/Code")
557       (setq projectile-project-search-path '("~/Code")))
558     (setq projectile-switch-project-action #'projectile-dired))
559
560   (use-package counsel-projectile
561     :after projectile
562     :config (counsel-projectile-mode))
563 #+end_src
564 ** Dired
565 The best file manager!
566 #+begin_src emacs-lisp
567   (use-package dired
568     :straight (:type built-in)
569     :commands (dired dired-jump)
570     :custom ((dired-listing-switches "-agho --group-directories-first"))
571     :config (evil-collection-define-key 'normal 'dired-mode-map
572               "h" 'dired-single-up-directory
573               "l" 'dired-single-buffer))
574
575   (use-package dired-single
576     :commands (dired dired-jump))
577
578   (use-package dired-open
579     :commands (dired dired-jump)
580     :custom (dired-open-extensions '(("png" . "feh")
581                                      ("mkv" . "mpv"))))
582
583   (use-package dired-hide-dotfiles
584     :hook (dired-mode . dired-hide-dotfiles-mode)
585     :config
586     (evil-collection-define-key 'normal 'dired-mode-map
587       "H" 'dired-hide-dotfiles-mode))
588 #+end_src
589 ** Git
590 *** Magit
591 **** TODO Write a command that commits hunk, skipping staging step.
592 A very good Git interface.
593 #+begin_src emacs-lisp
594   (use-package magit)
595 #+end_src
596 *** Email
597 #+begin_src emacs-lisp
598   (use-package piem)
599   (use-package git-email
600     :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
601     :config (git-email-piem-mode))
602 #+end_src
603 * General text editing
604 ** Indentation
605 Automatically indent after every change. I'm not sure how much I like this. It slows down the editor and code sometimes ends up in a half-indented state meaning I have to manually reformat using "==" anyways.
606 #+begin_src emacs-lisp
607   (use-package aggressive-indent
608     :config (global-aggressive-indent-mode))
609 #+end_src
610 ** Spell checking
611 Spell check in text mode, and in prog-mode comments.
612 #+begin_src emacs-lisp
613   (dolist (hook '(text-mode-hook))
614     (add-hook hook (lambda () (flyspell-mode))))
615   (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
616     (add-hook hook (lambda () (flyspell-mode -1))))
617   (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
618   (setq ispell-silently-savep t)
619 #+end_src
620 ** Sane tab width
621 #+begin_src emacs-lisp
622   (setq-default tab-width 2)
623 #+end_src
624 ** Save place
625 Opens file where you left it.
626 #+begin_src emacs-lisp
627   (save-place-mode)
628 #+end_src
629 ** Writing mode
630 Distraction free writing a la junegunn/goyo.
631 #+begin_src emacs-lisp
632   (use-package olivetti
633     :bind ("C-c o" . olivetti-mode))
634 #+end_src
635 ** Abbreviations
636 Abbreviate things! I just use this for things like my email address and copyright notice.
637 #+begin_src emacs-lisp
638   (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
639   (setq save-abbrevs 'silent)
640   (setq-default abbrev-mode t)
641 #+end_src
642 ** TRAMP
643 #+begin_src emacs-lisp
644   (setq tramp-default-method "ssh")
645 #+end_src
646 ** Follow version controlled symlinks
647 #+begin_src emacs-lisp
648   (setq vc-follow-symlinks t)
649 #+end_src
650 ** Open file as root
651 #+begin_src emacs-lisp
652   (defun doas-edit (&optional arg)
653     "Edit currently visited file as root.
654
655     With a prefix ARG prompt for a file to visit.
656     Will also prompt for a file to visit if current
657     buffer is not visiting a file.
658
659     Modified from Emacs Redux."
660     (interactive "P")
661     (if (or arg (not buffer-file-name))
662         (find-file (concat "/doas:root@localhost:"
663                            (ido-read-file-name "Find file(as root): ")))
664       (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
665
666     (global-set-key (kbd "C-x C-r") #'doas-edit)
667 #+end_src
668 ** Markdown mode
669 #+begin_src emacs-lisp
670   (use-package markdown-mode)
671 #+end_src
672 * Keybindings
673 ** Switch windows
674 #+begin_src emacs-lisp
675   (use-package ace-window
676     :bind ("M-o" . ace-window))
677 #+end_src
678 ** Kill current buffer
679 Makes "C-x k" binding faster.
680 #+begin_src emacs-lisp
681   (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
682 #+end_src
683 * Other settings
684 ** OpenSCAD syntax
685 #+begin_src emacs-lisp
686   (use-package scad-mode)
687 #+end_src
688 ** Control backup and lock files
689 Stop backup files from spewing everywhere.
690 #+begin_src emacs-lisp
691   (setq backup-directory-alist `(("." . "~/.emacs.d/backups"))
692         create-lockfiles nil)
693 #+end_src
694 ** Make yes/no easier
695 #+begin_src emacs-lisp
696   (defalias 'yes-or-no-p 'y-or-n-p)
697 #+end_src
698 ** Move customize file
699 No more clogging up init.el.
700 #+begin_src emacs-lisp
701   (setq custom-file "~/.emacs.d/custom.el")
702   (load custom-file)
703 #+end_src
704 ** Better help
705 #+begin_src emacs-lisp
706   (use-package helpful
707     :commands (helpful-callable helpful-variable helpful-command helpful-key)
708     :custom
709     (counsel-describe-function-function #'helpful-callable)
710     (counsel-describe-variable-function #'helpful-variable)
711     :bind
712     ([remap describe-function] . counsel-describe-function)
713     ([remap describe-command] . helpful-command)
714     ([remap describe-variable] . counsel-describe-variable)
715     ([remap describe-key] . helpful-key))
716 #+end_src
717 ** GPG
718 #+begin_src emacs-lisp
719   (use-package epa-file
720     :straight (:type built-in)
721     :custom
722     (epa-file-select-keys nil)
723     (epa-file-encrypt-to '("me@armaanb.net"))
724     (password-cache-expiry (* 60 15)))
725
726   (use-package pinentry
727     :config (pinentry-start))
728 #+end_src
729 ** Pastebin
730 #+begin_src emacs-lisp
731   (use-package 0x0
732     :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
733     :custom (0x0-default-service 'envs))
734 #+end_src
735 ** Automatically clean buffers
736 Automatically close unused buffers (except those of Circe) at midnight.
737 #+begin_src emacs-lisp
738   (midnight-mode)
739   (add-to-list 'clean-buffer-list-kill-never-regexps (lambda (buffer-name)
740                                                        (with-current-buffer buffer-name
741                                                          (derived-mode-p 'lui-mode))))
742 #+end_src
743 * Tangles
744 ** Spectrwm
745 Spectrwm is a really awesome window manager! Would highly recommend.
746 *** General settings
747 #+begin_src conf :tangle ~/.spectrwm.conf
748   workspace_limit = 5
749   warp_pointer = 1
750   modkey = Mod4
751   autorun = ws[1]:/home/armaa/Code/scripts/autostart
752 #+end_src
753 *** Bar
754 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.
755 #+begin_src conf :tangle ~/.spectrwm.conf
756   bar_enabled = 0
757   bar_font = xos4 JetBrains Mono:pixelsize=14:antialias=true # any installed font
758 #+end_src
759 *** Keybindings
760 I'm not a huge fan of how spectrwm handles keybindings, probably my biggest gripe with it.
761 **** WM actions
762 #+begin_src conf :tangle ~/.spectrwm.conf
763   program[term] = st -e tmux
764   program[screenshot_all] = flameshot gui
765   program[notif] = /home/armaa/Code/scripts/setter status
766   program[pass] = /home/armaa/Code/scripts/passmenu
767
768   bind[notif] = MOD+n
769   bind[pass] = MOD+Shift+p
770 #+end_src
771 **** Media keys
772 #+begin_src conf :tangle ~/.spectrwm.conf
773   program[paup] = /home/armaa/Code/scripts/setter audio +5
774   program[padown] = /home/armaa/Code/scripts/setter audio -5
775   program[pamute] = /home/armaa/Code/scripts/setter audio
776   program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
777   program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
778   program[next] = playerctl next
779   program[prev] = playerctl previous
780   program[pause] = playerctl play-pause
781
782   bind[padown] = XF86AudioLowerVolume
783   bind[paup] = XF86AudioRaiseVolume
784   bind[pamute] = XF86AudioMute
785   bind[brigdown] = XF86MonBrightnessDown
786   bind[brigup] = XF86MonBrightnessUp
787   bind[pause] = XF86AudioPlay
788   bind[next] = XF86AudioNext
789   bind[prev] = XF86AudioPrev
790 #+end_src
791 **** HJKL
792 #+begin_src conf :tangle ~/.spectrwm.conf
793   program[h] = xdotool keyup h key --clearmodifiers Left
794   program[j] = xdotool keyup j key --clearmodifiers Down
795   program[k] = xdotool keyup k key --clearmodifiers Up
796   program[l] = xdotool keyup l key --clearmodifiers Right
797
798   bind[h] = MOD + Control + h
799   bind[j] = MOD + Control + j
800   bind[k] = MOD + Control + k
801   bind[l] = MOD + Control + l
802 #+end_src
803 **** Programs
804 #+begin_src conf :tangle ~/.spectrwm.conf
805   program[email] = emacsclient -ce "(mu4e)"
806   program[irc] = emacsclient -ce '(switch-to-buffer "irc.armaanb.net:6698")'
807   program[rss] = emacsclient -ce '(elfeed)'
808   program[calendar] = emacsclient -ce '(acheam-calendar)'
809   program[calc] = emacsclient -ce '(progn (calc) (windmove-up) (delete-window))'
810   program[firefox] = firefox
811   program[emacs] = emacsclient -c
812
813   bind[email] = MOD+Control+1
814   bind[irc] = MOD+Control+2
815   bind[rss] = MOD+Control+3
816   bind[calendar] = MOD+Control+4
817   bind[calc] = MOD+Control+5
818   bind[firefox] = MOD+Control+0
819   bind[emacs] = MOD+Control+Return
820 #+end_src
821 *** Quirks
822 Float some specific programs by default.
823 #+begin_src conf :tangle ~/.spectrwm.conf
824   quirk[Castle Menu] = FLOAT
825   quirk[momen] = FLOAT
826 #+end_src
827 ** Ash
828 *** Options
829 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.
830 #+begin_src conf :tangle ~/.config/ash/ashrc
831   set -o vi
832 #+end_src
833 *** Functions
834 **** Interact with 0x0
835 #+begin_src shell :tangle ~/.config/ash/ashrc
836   zxz="https://envs.sh"
837   ufile() { curl -F"file=@$1" "$zxz" ; }
838   upb() { curl -F"file=@-;" "$zxz" ; }
839   uurl() { curl -F"url=$1" "$zxz" ; }
840   ushort() { curl -F"shorten=$1" "$zxz" ; }
841   uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
842 #+end_src
843 **** Finger
844 #+begin_src shell :tangle ~/.config/ash/ashrc
845   finger() {
846       user=$(echo "$1" | cut -f 1 -d '@')
847       host=$(echo "$1" | cut -f 2 -d '@')
848       echo $user | nc "$host" 79
849   }
850 #+end_src
851 **** Upload to ftp.armaanb.net
852 #+begin_src shell :tangle ~/.config/ash/ashrc
853   pubup() {
854       rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
855       echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
856   }
857 #+end_src
858 *** Exports
859 #+begin_src shell :tangle ~/.config/ash/ashrc
860   export EDITOR="emacsclient -c"
861   export VISUAL="$EDITOR"
862   export TERM=xterm-256color # for compatability
863
864   export GPG_TTY="$(tty)"
865   export MANPAGER='nvim +Man!'
866   export PAGER='less'
867
868   export GTK_USE_PORTAL=1
869
870   export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
871   export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
872   export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
873   export PATH="$PATH:/home/armaa/.cargo/bin"
874   export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
875   export PATH="$PATH:/usr/sbin"
876   export PATH="$PATH:/opt/FreeTube/freetube"
877
878   export LC_ALL="en_US.UTF-8"
879   export LC_CTYPE="en_US.UTF-8"
880   export LANGUAGE="en_US.UTF-8"
881
882   export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
883   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
884   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
885   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
886   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
887   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
888   export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig"
889 #+end_src
890 *** Aliases
891 **** SSH
892 #+begin_src shell :tangle ~/.config/ash/ashrc
893   alias bhoji-drop='ssh -p 23 root@armaanb.net'
894   alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
895   alias union='ssh 192.168.1.18'
896   alias mine='ssh -p 23 root@pickupserver.cc'
897   alias tcf='ssh root@204.48.23.68'
898   alias ngmun='ssh root@157.245.89.25'
899   alias prox='ssh root@192.168.1.224'
900   alias ncq='ssh root@143.198.123.17'
901   alias envs='ssh acheam@envs.net'
902 #+end_src
903 **** File management
904 #+begin_src shell :tangle ~/.config/ash/ashrc
905   alias ls='ls -lh --group-directories-first'
906   alias la='ls -A'
907   alias df='df -h / /boot'
908   alias du='du -h'
909   alias free='free -m'
910   alias cp='cp -riv'
911   alias rm='rm -iv'
912   alias mv='mv -iv'
913   alias ln='ln -v'
914   alias grep='grep -in'
915   alias mkdir='mkdir -pv'
916   alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
917   emacs() { $EDITOR "$@" & }
918   alias vim="emacs"
919 #+end_src
920 **** System management
921 #+begin_src shell :tangle ~/.config/ash/ashrc
922   alias crontab='crontab-argh'
923   alias sudo='doas'
924   alias pasu='git -C ~/.password-store push'
925   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
926     yadm push'
927 #+end_src
928 **** Networking
929 #+begin_src shell :tangle ~/.config/ash/ashrc
930   alias ping='ping -c 10'
931   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
932   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
933   alias plan='T=$(mktemp) && \
934         rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
935         TT=$(mktemp) && \
936         head -n -2 $T > $TT && \
937         /bin/nvim $TT && \
938         echo "\nLast updated: $(date -R)" >> "$TT" && \
939         fold -sw 72 "$TT" > "$T"| \
940         rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
941 #+end_src
942 **** Virtual machines, chroots
943 #+begin_src shell :tangle ~/.config/ash/ashrc
944   alias ckiss="doas chrooter ~/Virtual/kiss"
945   alias cdebian="doas chrooter ~/Virtual/debian bash"
946   alias cwindows='devour qemu-system-x86_64 \
947     -smp 3 \
948     -cpu host \
949     -enable-kvm \
950     -m 3G \
951     -device VGA,vgamem_mb=64 \
952     -device intel-hda \
953     -device hda-duplex \
954     -net nic \
955     -net user,smb=/home/armaa/Public \
956     -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
957 #+end_src
958 **** Latin
959 #+begin_src shell :tangle ~/.config/ash/ashrc
960   alias words='gen-shell -c "words"'
961   alias words-e='gen-shell -c "words ~E"'
962 #+end_src
963 **** Other
964 #+begin_src shell :tangle ~/.config/ash/ashrc
965   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
966     iflag=fullblock'
967   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
968     iflag=fullblock'
969   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
970     --restrict-filenames -o '%(title)s.%(ext)s'"
971   alias bc='bc -l'
972 #+end_src
973 ** MPV
974 Make MPV play a little bit smoother.
975 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
976   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
977   hwdec=auto-copy
978 #+end_src
979 ** Inputrc
980 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!.
981 #+begin_src conf :tangle ~/.inputrc
982   set editing-mode emacs
983 #+end_src
984 ** Git
985 *** User
986 #+begin_src conf :tangle ~/.gitconfig
987   [user]
988   name = Armaan Bhojwani
989   email = me@armaanb.net
990   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
991 #+end_src
992 *** Init
993 #+begin_src conf :tangle ~/.gitconfig
994   [init]
995   defaultBranch = main
996 #+end_src
997 *** GPG
998 #+begin_src conf :tangle ~/.gitconfig
999   [gpg]
1000   program = gpg
1001 #+end_src
1002 *** Sendemail
1003 #+begin_src conf :tangle ~/.gitconfig
1004   [sendemail]
1005   smtpserver = smtp.mailbox.org
1006   smtpuser = me@armaanb.net
1007   smtpencryption = ssl
1008   smtpserverport = 465
1009   confirm = auto
1010 #+end_src
1011 *** Submodule
1012 #+begin_src conf :tangle ~/.gitconfig
1013   [submodule]
1014   recurse = true
1015 #+end_src
1016 *** Aliases
1017 #+begin_src conf :tangle ~/.gitconfig
1018   [alias]
1019   stat = diff --stat
1020   sclone = clone --depth 1
1021   sclean = clean -dfX
1022   a = add
1023   aa = add .
1024   c = commit
1025   quickfix = commit . --amend --no-edit
1026   p = push
1027   subup = submodule update --remote
1028   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1029   pushnc = push -o skip-ci
1030 #+end_src
1031 *** Commit
1032 #+begin_src conf :tangle ~/.gitconfig
1033   [commit]
1034   gpgsign = true
1035   verbose = true
1036 #+end_src
1037 ** Dunst
1038 Lightweight notification daemon. Eventually I'd like to replace this with something dbus-less.
1039 *** General
1040 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1041   [global]
1042   font = "JetBrains Mono Medium Nerd Font 11"
1043   allow_markup = yes
1044   format = "<b>%s</b>\n%b"
1045   sort = no
1046   indicate_hidden = yes
1047   alignment = center
1048   bounce_freq = 0
1049   show_age_threshold = 60
1050   word_wrap = yes
1051   ignore_newline = no
1052   geometry = "400x5-10+10"
1053   transparency = 0
1054   idle_threshold = 120
1055   monitor = 0
1056   sticky_history = yes
1057   line_height = 0
1058   separator_height = 1
1059   padding = 8
1060   horizontal_padding = 8
1061   max_icon_size = 32
1062   separator_color = "#ffffff"
1063   startup_notification = false
1064 #+end_src
1065 *** Modes
1066 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1067   [frame]
1068   width = 1
1069   color = "#ffffff"
1070
1071   [shortcuts]
1072   close = mod4+c
1073   close_all = mod4+shift+c
1074   history = mod4+ctrl+c
1075
1076   [urgency_low]
1077   background = "#222222"
1078   foreground = "#ffffff"
1079   highlight = "#ffffff"
1080   timeout = 5
1081
1082   [urgency_normal]
1083   background = "#222222"
1084   foreground = "#ffffff"
1085   highlight = "#ffffff"
1086   timeout = 15
1087
1088   [urgency_critical]
1089   background = "#222222"
1090   foreground = "#a60000"
1091   highlight = "#ffffff"
1092   timeout = 0
1093 #+end_src
1094 ** Zathura
1095 The best document reader!
1096 *** Options
1097 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1098   map <C-i> recolor
1099   map <A-b> toggle_statusbar
1100   set selection-clipboard clipboard
1101   set scroll-step 200
1102
1103   set window-title-basename "true"
1104   set selection-clipboard "clipboard"
1105 #+end_src
1106 *** Colors
1107 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1108   set default-bg         "#000000"
1109   set default-fg         "#ffffff"
1110   set render-loading     true
1111   set render-loading-bg  "#000000"
1112   set render-loading-fg  "#ffffff"
1113
1114   set recolor-lightcolor "#000000" # bg
1115   set recolor-darkcolor  "#ffffff" # fg
1116   set recolor            "true"
1117 #+end_src
1118 ** Firefox
1119 Just some basic Firefox CSS. Will probably have to rewrite for the Proton redesign.
1120 *** Swap tab and URL bars
1121 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1122   #nav-bar {
1123       -moz-box-ordinal-group: 1 !important;
1124   }
1125
1126   #PersonalToolbar {
1127       -moz-box-ordinal-group: 2 !important;
1128   }
1129
1130   #titlebar {
1131       -moz-box-ordinal-group: 3 !important;
1132   }
1133 #+end_src
1134 *** Hide URL bar when not focused.
1135 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1136   #navigator-toolbox:not(:focus-within):not(:hover) {
1137       margin-top: -30px;
1138   }
1139
1140   #navigator-toolbox {
1141       transition: 0.1s margin-top ease-out;
1142   }
1143 #+end_src
1144 *** Black screen by default
1145 userChrome.css:
1146 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1147   #main-window,
1148   #browser,
1149   #browser vbox#appcontent tabbrowser,
1150   #content,
1151   #tabbrowser-tabpanels,
1152   #tabbrowser-tabbox,
1153   browser[type="content-primary"],
1154   browser[type="content"] > html,
1155   .browserContainer {
1156       background: black !important;
1157       color: #fff !important;
1158   }
1159 #+end_src
1160
1161 userContent.css:
1162 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1163   @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1164       body {
1165           background: black !important;
1166       }
1167   }
1168 #+end_src
1169 ** Xresources
1170 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.
1171 #+begin_src conf :tangle ~/.Xresources
1172   ! special
1173   ,*.foreground:   #ffffff
1174   ,*.background:   #000000
1175   ,*.cursorColor:  #ffffff
1176
1177   ! black
1178   ,*.color0:       #000000
1179   ,*.color8:       #555555
1180
1181   ! red
1182   ,*.color1:       #ff8059
1183   ,*.color9:       #ffa0a0
1184
1185   ! green
1186   ,*.color2:       #00fc50
1187   ,*.color10:      #88cf88
1188
1189   ! yellow
1190   ,*.color3:       #eecc00
1191   ,*.color11:      #d2b580
1192
1193   ! blue
1194   ,*.color4:       #29aeff
1195   ,*.color12:      #92baff
1196
1197   ! magenta
1198   ,*.color5:       #feacd0
1199   ,*.color13:      #e0b2d6
1200
1201   ! cyan
1202   ,*.color6:       #00d3d0
1203   ,*.color14:      #a0bfdf
1204
1205   ! white
1206   ,*.color7:       #eeeeee
1207   ,*.color15:      #dddddd
1208 #+end_src
1209 ** Tmux
1210 I use tmux in order to keep my st build light. Still learning how it works.
1211 #+begin_src conf :tangle ~/.tmux.conf
1212   set -g status off
1213   set -g mouse on
1214   set-option -g history-limit 50000
1215   set-window-option -g mode-keys vi
1216   bind-key -T copy-mode-vi 'v' send -X begin-selection
1217   bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
1218 #+end_src
1219 ** GPG
1220 *** Config
1221 #+begin_src conf :tangle ~/.gnupg/gpg.conf
1222   default-key 3C9ED82FFE788E4A
1223   use-agent
1224 #+end_src
1225 *** Agent
1226 #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
1227   pinentry-program /sbin/pinentry-gnome3
1228   max-cache-ttl 600
1229   default-cache-ttl 600
1230   allow-emacs-pinentry
1231 #+end_src