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