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