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