]> git.armaanb.net Git - config.org.git/blob - config.org
Update TODOs
[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           mu4e-contexts
361           `( ,(make-mu4e-context
362                :name "school"
363                :enter-func (lambda () (mu4e-message "Entering school context"))
364                :leave-func (lambda () (mu4e-message "Leaving school context"))
365                :match-func (lambda (msg)
366                              (when msg
367                                (string-match-p "^/school" (mu4e-message-field msg :maildir))))
368                :vars '((user-mail-address . "abhojwani22@nobles.edu")
369                        (mu4e-sent-folder . "/school/Sent")
370                        (mu4e-drafts-folder . "/school/Drafts")
371                        (mu4e-trash-folder . "/school/Trash")
372                        (mu4e-refile-folder . "/school/Archive")
373                        (message-cite-reply-position . above)
374                        (user-mail-address . "abhojwani22@nobles.edu")
375                        (smtpmail-smtp-user . "abhojwani22@nobles.edu")
376                        (smtpmail-smtp-server . "smtp.gmail.com")))
377              ,(make-mu4e-context
378                :name "personal"
379                :enter-func (lambda () (mu4e-message "Entering personal context"))
380                :leave-func (lambda () (mu4e-message "Leaving personal context"))
381                :match-func (lambda (msg)
382                              (when msg
383                                (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
384                :vars '((mu4e-sent-folder . "/personal/Sent")
385                        (mu4e-drafts-folder . "/personal/Drafts")
386                        (mu4e-trash-folder . "/personal/Trash")
387                        (mu4e-refile-folder . "/personal/Archive")
388                        (user-mail-address . "me@armaanb.net")
389                        (message-cite-reply-position . below)
390                        (smtpmail-smtp-user . "me@armaanb.net")
391                        (smtpmail-smtp-server . "smtp.mailbox.org")))))
392     (add-to-list 'mu4e-bookmarks
393                  '(:name "Unified inbox"
394                          :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
395                          :key ?b))
396     :hook ((mu4e-compose-mode . flyspell-mode)
397            (mu4e-compose-mode . auto-fill-mode)
398            (mu4e-view-mode-hook . turn-on-visual-line-mode)))
399
400 #+end_src
401 Discourage Gnus from displaying HTML emails
402 #+begin_src emacs-lisp
403   (with-eval-after-load "mm-decode"
404     (add-to-list 'mm-discouraged-alternatives "text/html")
405     (add-to-list 'mm-discouraged-alternatives "text/richtext"))
406 #+end_src
407 ** Default browser
408 Set EWW as default browser except for videos.
409 #+begin_src emacs-lisp
410   (defun browse-url-mpv (url &optional new-window)
411     "Open URL in MPV."
412     (start-process "mpv" "*mpv*" "mpv" url))
413
414   (setq browse-url-handlers
415         (quote
416          (("youtu\\.?be" . browse-url-mpv)
417           ("peertube.*" . browse-url-mpv)
418           ("vid.*" . browse-url-mpv)
419           ("vid.*" . browse-url-mpv)
420           ("." . eww-browse-url)
421           )))
422 #+end_src
423 ** EWW
424 Some EWW enhancements.
425 *** Give buffer a useful name
426 #+begin_src emacs-lisp
427   ;; From https://protesilaos.com/dotemacs/
428   (defun prot-eww--rename-buffer ()
429     "Rename EWW buffer using page title or URL.
430         To be used by `eww-after-render-hook'."
431     (let ((name (if (eq "" (plist-get eww-data :title))
432                     (plist-get eww-data :url)
433                   (plist-get eww-data :title))))
434       (rename-buffer (format "*%s # eww*" name) t)))
435
436   (use-package eww
437     :straight (:type built-in)
438     :bind (("C-c w" . eww))
439     :hook (eww-after-render-hook prot-eww--rename-buffer))
440 #+end_src
441 *** Keybinding
442 #+begin_src emacs-lisp
443   (global-set-key (kbd "C-c w") 'eww)
444 #+end_src
445 ** IRC
446 #+begin_src emacs-lisp
447   (use-package circe
448     :config
449     (enable-lui-track)
450     (enable-circe-color-nicks))
451
452   (defun fetch-password (&rest params)
453     (require 'auth-source)
454     (let ((match (car (apply 'auth-source-search params))))
455       (if match
456           (let ((secret (plist-get match :secret)))
457             (if (functionp secret)
458                 (funcall secret)
459               secret))
460         (error "Password not found for %S" params))))
461
462   (setq circe-network-options
463         '(("pounce"
464            :host "irc.armaanb.net"
465            :nick "emacs"
466            :use-tls t
467            :port "6697"
468            :pass (lambda (fetch-password
469                           :login "emacs"
470                           :machine "irc.armaanb.net"
471                           :port 6697))))
472
473         (circe "pounce")
474 #+end_src
475 ** Emacs Anywhere
476 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
477 #+begin_src emacs-lisp
478   (use-package emacs-everywhere)
479 #+end_src
480 * Emacs IDE
481 ** Code cleanup
482 #+begin_src emacs-lisp
483   (use-package blacken
484     :hook (python-mode . blacken-mode)
485     :config (setq blacken-line-length 79))
486
487   ;; Purge whitespace
488   (use-package ws-butler
489     :config (ws-butler-global-mode))
490 #+end_src
491 ** Flycheck
492 #+begin_src emacs-lisp
493   (use-package flycheck
494     :config (global-flycheck-mode))
495 #+end_src
496 ** Project management
497 #+begin_src emacs-lisp
498   (use-package projectile
499     :config (projectile-mode)
500     :custom ((projectile-completion-system 'ivy))
501     :bind-keymap
502     ("C-c p" . projectile-command-map)
503     :init
504     (when (file-directory-p "~/Code")
505       (setq projectile-project-search-path '("~/Code")))
506     (setq projectile-switch-project-action #'projectile-dired))
507
508   (use-package counsel-projectile
509     :after projectile
510     :config (counsel-projectile-mode))
511 #+end_src
512 ** Dired
513 #+begin_src emacs-lisp
514   (use-package dired
515     :straight (:type built-in)
516     :commands (dired dired-jump)
517     :custom ((dired-listing-switches "-agho --group-directories-first"))
518     :config (evil-collection-define-key 'normal 'dired-mode-map
519               "h" 'dired-single-up-directory
520               "l" 'dired-single-buffer))
521
522   (use-package dired-single
523     :commands (dired dired-jump))
524
525   (use-package dired-open
526     :commands (dired dired-jump)
527     :custom (dired-open-extensions '(("png" . "feh")
528                                      ("mkv" . "mpv"))))
529
530   (use-package dired-hide-dotfiles
531     :hook (dired-mode . dired-hide-dotfiles-mode)
532     :config
533     (evil-collection-define-key 'normal 'dired-mode-map
534       "H" 'dired-hide-dotfiles-mode))
535 #+end_src
536 ** Git
537 *** Magit
538 # TODO: Write a command that commits hunk, skipping staging step.
539 #+begin_src emacs-lisp
540   (use-package magit)
541 #+end_src
542 *** Colored diff in line number area
543 #+begin_src emacs-lisp
544   (use-package diff-hl
545     :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
546     :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
547            (magit-post-refresh-hook . diff-hl-magit-post-refresh))
548     :config (global-diff-hl-mode))
549 #+end_src
550 *** Email
551 #+begin_src emacs-lisp
552   (use-package piem)
553   (use-package git-email
554     :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
555     :config (git-email-piem-mode))
556 #+end_src
557 ** Java
558 *** Evaluate current buffer
559 Stolen from https://stackoverflow.com/questions/19953924/how-do-you-run-java-codes-in-emacs
560 #+begin_src emacs-lisp
561   (defun java-eval-buffer ()
562     "run current program (that requires no input)"
563     (interactive)
564     (let* ((source (file-name-nondirectory buffer-file-name))
565            (out    (file-name-sans-extension source))
566            (class  (concat out ".class")))
567       (save-buffer)
568       (shell-command (format "rm -f %s && javac %s" class source))
569       (if (file-exists-p class)
570           (shell-command (format "java %s" out) "*scratch*")
571         (progn
572           (set (make-local-variable 'compile-command)
573                (format "javac %s" source))
574           (command-execute 'compile)))))
575 #+end_src
576 * General text editing
577 ** Indentation
578 Indent after every change.
579 #+begin_src emacs-lisp
580   (use-package aggressive-indent
581     :config (global-aggressive-indent-mode))
582 #+end_src
583 ** Spell checking
584 Spell check in text mode, and in prog-mode comments.
585 #+begin_src emacs-lisp
586   (dolist (hook '(text-mode-hook))
587     (add-hook hook (lambda () (flyspell-mode))))
588   (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
589     (add-hook hook (lambda () (flyspell-mode -1))))
590   (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
591 #+end_src
592 ** Expand tabs to spaces
593 #+begin_src emacs-lisp
594   (setq-default tab-width 2)
595 #+end_src
596 ** Copy kill ring to clipboard
597 #+begin_src emacs-lisp
598   (setq x-select-enable-clipboard t)
599   (defun copy-kill-ring-to-xorg ()
600     "Copy the current kill ring to the xorg clipboard."
601     (interactive)
602     (x-select-text (current-kill 0)))
603 #+end_src
604 ** Save place
605 Opens file where you left it.
606 #+begin_src emacs-lisp
607   (save-place-mode)
608 #+end_src
609 ** Writing mode
610 Distraction free writing a la junegunn/goyo.
611 #+begin_src emacs-lisp
612   (use-package olivetti
613     :config
614     (evil-leader/set-key "o" 'olivetti-mode))
615 #+end_src
616 ** Abbreviations
617 Abbreviate things!
618 #+begin_src emacs-lisp
619   (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
620   (setq save-abbrevs 'silent)
621   (setq-default abbrev-mode t)
622 #+end_src
623 ** TRAMP
624 #+begin_src emacs-lisp
625   (setq tramp-default-method "ssh")
626 #+end_src
627 ** Don't ask about following symlinks in vc
628 #+begin_src emacs-lisp
629   (setq vc-follow-symlinks t)
630 #+end_src
631 ** Don't ask to save custom dictionary
632 #+begin_src emacs-lisp
633   (setq ispell-silently-savep t)
634 #+end_src
635 ** Open file as root
636 #+begin_src emacs-lisp
637   (defun doas-edit (&optional arg)
638     "Edit currently visited file as root.
639
640     With a prefix ARG prompt for a file to visit.
641     Will also prompt for a file to visit if current
642     buffer is not visiting a file.
643
644     Modified from Emacs Redux."
645     (interactive "P")
646     (if (or arg (not buffer-file-name))
647         (find-file (concat "/doas:root@localhost:"
648                            (ido-read-file-name "Find file(as root): ")))
649       (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
650
651     (global-set-key (kbd "C-x C-r") #'doas-edit)
652 #+end_src
653 * Keybindings
654 ** Switch windows
655 #+begin_src emacs-lisp
656   (use-package ace-window
657     :bind ("M-o" . ace-window))
658 #+end_src
659 ** Kill current buffer
660 Makes "C-x k" binding faster.
661 #+begin_src emacs-lisp
662   (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
663 #+end_src
664 * Other settings
665 ** OpenSCAD
666 #+begin_src emacs-lisp
667   (use-package scad-mode)
668 #+end_src
669 ** Control backup files
670 Stop backup files from spewing everywhere.
671 #+begin_src emacs-lisp
672   (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
673 #+end_src
674 ** Make yes/no easier
675 #+begin_src emacs-lisp
676   (defalias 'yes-or-no-p 'y-or-n-p)
677 #+end_src
678 ** Move customize file
679 No more clogging up init.el.
680 #+begin_src emacs-lisp
681   (setq custom-file "~/.emacs.d/custom.el")
682   (load custom-file)
683 #+end_src
684 ** Better help
685 #+begin_src emacs-lisp
686   (use-package helpful
687     :commands (helpful-callable helpful-variable helpful-command helpful-key)
688     :custom
689     (counsel-describe-function-function #'helpful-callable)
690     (counsel-describe-variable-function #'helpful-variable)
691     :bind
692     ([remap describe-function] . counsel-describe-function)
693     ([remap describe-command] . helpful-command)
694     ([remap describe-variable] . counsel-describe-variable)
695     ([remap describe-key] . helpful-key))
696 #+end_src
697 ** GPG
698 #+begin_src emacs-lisp
699   (use-package epa-file
700     :straight (:type built-in)
701     :custom
702     (epa-file-select-keys nil)
703     (epa-file-encrypt-to '("me@armaanb.net"))
704     (password-cache-expiry (* 60 15)))
705
706   (use-package pinentry
707     :config (pinentry-start))
708 #+end_src
709 ** Pastebin
710 #+begin_src emacs-lisp
711   (use-package 0x0
712     :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
713     :custom (0x0-default-service 'envs)
714     :config (evil-leader/set-key
715               "00" '0x0-upload
716               "0f" '0x0-upload-file
717               "0s" '0x0-upload-string
718               "0c" '0x0-upload-kill-ring
719               "0p" '0x0-upload-popup))
720 #+end_src
721 * Tangles
722 ** Spectrwm
723 *** General settings
724 #+begin_src conf :tangle ~/.spectrwm.conf
725   workspace_limit = 5
726   warp_pointer = 1
727   modkey = Mod4
728   autorun = ws[1]:/home/armaa/Code/scripts/autostart
729 #+end_src
730 *** Bar
731 #+begin_src conf :tangle ~/.spectrwm.conf
732   bar_enabled = 0
733   bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
734 #+end_src
735 *** Keybindings
736 **** WM actions
737 #+begin_src conf :tangle ~/.spectrwm.conf
738   program[term] = st -e tmux
739   program[screenshot_all] = flameshot gui
740   program[notif] = /home/armaa/Code/scripts/setter status
741   program[pass] = /home/armaa/Code/scripts/passmenu
742
743   bind[notif] = MOD+n
744   bind[pass] = MOD+Shift+p
745 #+end_src
746 **** Media keys
747 #+begin_src conf :tangle ~/.spectrwm.conf
748   program[paup] = /home/armaa/Code/scripts/setter audio +5
749   program[padown] = /home/armaa/Code/scripts/setter audio -5
750   program[pamute] = /home/armaa/Code/scripts/setter audio
751   program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
752   program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
753   program[next] = playerctl next
754   program[prev] = playerctl previous
755   program[pause] = playerctl play-pause
756
757   bind[padown] = XF86AudioLowerVolume
758   bind[paup] = XF86AudioRaiseVolume
759   bind[pamute] = XF86AudioMute
760   bind[brigdown] = XF86MonBrightnessDown
761   bind[brigup] = XF86MonBrightnessUp
762   bind[pause] = XF86AudioPlay
763   bind[next] = XF86AudioNext
764   bind[prev] = XF86AudioPrev
765 #+end_src
766 **** HJKL
767 #+begin_src conf :tangle ~/.spectrwm.conf
768   program[h] = xdotool keyup h key --clearmodifiers Left
769   program[j] = xdotool keyup j key --clearmodifiers Down
770   program[k] = xdotool keyup k key --clearmodifiers Up
771   program[l] = xdotool keyup l key --clearmodifiers Right
772
773   bind[h] = MOD + Control + h
774   bind[j] = MOD + Control + j
775   bind[k] = MOD + Control + k
776   bind[l] = MOD + Control + l
777 #+end_src
778 **** Programs
779 #+begin_src conf :tangle ~/.spectrwm.conf
780   program[email] = emacsclient -c --eval "(mu4e)"
781   program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6697")'
782   program[emacs] = emacsclient -c
783   program[firefox] = firefox
784   program[calc] = st -e because -l
785   program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
786
787   bind[email] = MOD+Control+1
788   bind[irc] = MOD+Control+2
789   bind[firefox] = MOD+Control+3
790   bind[emacs-anywhere] = MOD+Control+4
791   bind[calc] = MOD+Control+5
792   bind[emacs] = MOD+Control+Return
793 #+end_src
794 **** Quirks
795 #+begin_src conf :tangle ~/.spectrwm.conf
796   quirk[Castle Menu] = FLOAT
797   quirk[momen] = FLOAT
798 #+end_src
799 ** Ash
800 *** Options
801 #+begin_src conf :tangle ~/.config/ash/ashrc
802   set -o vi
803 #+end_src
804 *** Functions
805 **** Update all packages
806 #+begin_src shell :tangle ~/.config/ash/ashrc
807   color=$(tput setaf 5)
808   reset=$(tput sgr0)
809
810   apu() {
811       doas echo "${color}== upgrading with yay ==${reset}"
812       yay
813       echo ""
814       echo "${color}== checking for pacnew files ==${reset}"
815       doas pacdiff
816       echo
817       echo "${color}== upgrading flatpaks ==${reset}"
818       flatpak update
819       echo ""
820       echo "${color}== updating nvim plugins ==${reset}"
821       nvim +PlugUpdate +PlugUpgrade +qall
822       echo "Updated nvim plugins"
823       echo ""
824       echo "${color}You are entirely up to date!${reset}"
825   }
826 #+end_src
827 **** Clean all packages
828 #+begin_src shell :tangle ~/.config/ash/ashrc
829   apap() {
830       doas echo "${color}== cleaning pacman orphans ==${reset}"
831       (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
832       echo ""
833       echo "${color}== cleaning flatpaks ==${reset}"
834       flatpak remove --unused
835       echo ""
836       echo "${color}== cleaning nvim plugins ==${reset}"
837       nvim +PlugClean +qall
838       echo "Cleaned nvim plugins"
839       echo ""
840       echo "${color}All orphans cleaned!${reset}"
841   }
842 #+end_src
843 **** Interact with 0x0
844 #+begin_src shell :tangle ~/.config/ash/ashrc
845   zxz="https://envs.sh"
846   ufile() { curl -F"file=@$1" "$zxz" ; }
847   upb() { curl -F"file=@-;" "$zxz" ; }
848   uurl() { curl -F"url=$1" "$zxz" ; }
849   ushort() { curl -F"shorten=$1" "$zxz" ; }
850   uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
851 #+end_src
852 **** Finger
853 #+begin_src shell :tangle ~/.config/ash/ashrc
854   finger() {
855       user=$(echo "$1" | cut -f 1 -d '@')
856       host=$(echo "$1" | cut -f 2 -d '@')
857       echo $user | nc "$host" 79
858   }
859 #+end_src
860 **** Upload to ftp.armaanb.net
861 #+begin_src shell :tangle ~/.config/ash/ashrc
862   pubup() {
863       rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
864       echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
865   }
866 #+end_src
867 *** Exports
868 #+begin_src shell :tangle ~/.config/ash/ashrc
869   export EDITOR="emacsclient -c"
870   export VISUAL="$EDITOR"
871   export TERM=xterm-256color # for compatability
872
873   export GPG_TTY="$(tty)"
874   export MANPAGER='nvim +Man!'
875   export PAGER='less'
876
877   export GTK_USE_PORTAL=1
878
879   export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
880   export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
881   export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
882   export PATH="$PATH:/home/armaa/.cargo/bin"
883   export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
884   export PATH="$PATH:/usr/sbin"
885   export PATH="$PATH:/opt/FreeTube/freetube"
886
887   export LC_ALL="en_US.UTF-8"
888   export LC_CTYPE="en_US.UTF-8"
889   export LANGUAGE="en_US.UTF-8"
890
891   export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
892   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
893   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
894   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
895   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
896   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
897 #+end_src
898 *** Aliases
899 **** SSH
900 #+begin_src shell :tangle ~/.config/ash/ashrc
901   alias bhoji-drop='ssh -p 23 root@armaanb.net'
902   alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
903   alias union='ssh 192.168.1.18'
904   alias mine='ssh -p 23 root@pickupserver.cc'
905   alias tcf='ssh root@204.48.23.68'
906   alias ngmun='ssh root@157.245.89.25'
907   alias prox='ssh root@192.168.1.224'
908   alias ncq='ssh root@143.198.123.17'
909   alias envs='ssh acheam@envs.net'
910 #+end_src
911 **** File management
912 #+begin_src shell :tangle ~/.config/ash/ashrc
913   alias ls='ls -lh --group-directories-first'
914   alias la='ls -A'
915   alias df='df -h / /boot'
916   alias du='du -h'
917   alias free='free -h'
918   alias cp='cp -riv'
919   alias rm='rm -iv'
920   alias mv='mv -iv'
921   alias ln='ln -v'
922   alias grep='grep -in --color=auto'
923   alias mkdir='mkdir -pv'
924   alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
925   alias vim=$EDITOR
926   alias emacs=$EDITOR
927 #+end_src
928 **** System management
929 #+begin_src shell :tangle ~/.config/ash/ashrc
930   alias pkill='pkill -i'
931   alias crontab='crontab-argh'
932   alias sudo='doas'
933   alias pasu='git -C ~/.password-store push'
934   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
935     yadm push'
936 #+end_src
937 **** Networking
938 #+begin_src shell :tangle ~/.config/ash/ashrc
939   alias ping='ping -c 10'
940   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
941   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
942   alias plan='T=$(mktemp) && \
943         rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
944         TT=$(mktemp) && \
945         head -n -2 $T > $TT && \
946         vim $TT && \
947         echo "\nLast updated: $(date -R)" >> "$TT" && \
948         fold -sw 72 "$TT" > "$T"| \
949         rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
950 #+end_src
951 **** Virtual machines, chroots
952 #+begin_src shell :tangle ~/.config/ash/ashrc
953   alias ckiss="doas chrooter ~/Virtual/kiss"
954   alias cdebian="doas chrooter ~/Virtual/debian bash"
955   alias cwindows='devour qemu-system-x86_64 \
956     -smp 3 \
957     -cpu host \
958     -enable-kvm \
959     -m 3G \
960     -device VGA,vgamem_mb=64 \
961     -device intel-hda \
962     -device hda-duplex \
963     -net nic \
964     -net user,smb=/home/armaa/Public \
965     -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
966 #+end_src
967 **** Python
968 #+begin_src shell :tangle ~/.config/ash/ashrc
969   alias pip="python -m pip"
970   alias black="black -l 79"
971 #+end_src
972 **** Latin
973 #+begin_src shell :tangle ~/.config/ash/ashrc
974   alias words='gen-shell -c "words"'
975   alias words-e='gen-shell -c "words ~E"'
976 #+end_src
977 **** Devour
978 #+begin_src shell :tangle ~/.config/ash/ashrc
979   alias zathura='devour zathura'
980   alias cad='devour openscad'
981   alias feh='devour feh'
982 #+end_src
983 **** Pacman
984 #+begin_src shell :tangle ~/.config/ash/ashrc
985   alias aps='yay -Ss'
986   alias api='yay -Syu'
987   alias apii='doas pacman -S'
988   alias app='yay -Rns'
989   alias azf='pacman -Q | fzf'
990   alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
991 #+end_src
992 **** Other
993 #+begin_src shell :tangle ~/.config/ash/ashrc
994   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
995     iflag=fullblock status=progress'
996   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
997     iflag=fullblock status=progress'
998   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
999     --restrict-filenames -o '%(title)s.%(ext)s'"
1000   alias cal="cal -3 --color=auto"
1001   alias bc='bc -l'
1002 #+end_src
1003 ** IPython
1004 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1005   c.TerminalInteractiveShell.editing_mode = 'vi'
1006   c.InteractiveShell.colors = 'linux'
1007   c.TerminalInteractiveShell.confirm_exit = False
1008 #+end_src
1009 ** MPV
1010 Make MPV play a little bit smoother.
1011 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1012   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1013   hwdec=auto-copy
1014 #+end_src
1015 ** Inputrc
1016 For any GNU Readline programs
1017 #+begin_src conf :tangle ~/.inputrc
1018   set editing-mode emacs
1019 #+end_src
1020 ** Git
1021 *** User
1022 #+begin_src conf :tangle ~/.gitconfig
1023   [user]
1024   name = Armaan Bhojwani
1025   email = me@armaanb.net
1026   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1027 #+end_src
1028 *** Init
1029 #+begin_src conf :tangle ~/.gitconfig
1030   [init]
1031   defaultBranch = main
1032 #+end_src
1033 *** GPG
1034 #+begin_src conf :tangle ~/.gitconfig
1035   [gpg]
1036   program = gpg
1037 #+end_src
1038 *** Sendemail
1039 #+begin_src conf :tangle ~/.gitconfig
1040   [sendemail]
1041   smtpserver = smtp.mailbox.org
1042   smtpuser = me@armaanb.net
1043   smtpencryption = ssl
1044   smtpserverport = 465
1045   confirm = auto
1046 #+end_src
1047 *** Submodules
1048 #+begin_src conf :tangle ~/.gitconfig
1049   [submodule]
1050   recurse = true
1051 #+end_src
1052 *** Aliases
1053 #+begin_src conf :tangle ~/.gitconfig
1054   [alias]
1055   stat = diff --stat
1056   sclone = clone --depth 1
1057   sclean = clean -dfX
1058   a = add
1059   aa = add .
1060   c = commit
1061   quickfix = commit . --amend --no-edit
1062   p = push
1063   subup = submodule update --remote
1064   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1065   pushnc = push -o skip-ci
1066 #+end_src
1067 *** Commits
1068 #+begin_src conf :tangle ~/.gitconfig
1069   [commit]
1070   gpgsign = true
1071   verbose = true
1072 #+end_src
1073 ** Dunst
1074 Lightweight notification daemon.
1075 *** General
1076 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1077   [global]
1078   font = "JetBrains Mono Medium Nerd Font 11"
1079   allow_markup = yes
1080   format = "<b>%s</b>\n%b"
1081   sort = no
1082   indicate_hidden = yes
1083   alignment = center
1084   bounce_freq = 0
1085   show_age_threshold = 60
1086   word_wrap = yes
1087   ignore_newline = no
1088   geometry = "400x5-10+10"
1089   transparency = 0
1090   idle_threshold = 120
1091   monitor = 0
1092   sticky_history = yes
1093   line_height = 0
1094   separator_height = 1
1095   padding = 8
1096   horizontal_padding = 8
1097   max_icon_size = 32
1098   separator_color = "#ffffff"
1099   startup_notification = false
1100 #+end_src
1101 *** Modes
1102 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1103   [frame]
1104   width = 1
1105   color = "#ffffff"
1106
1107   [shortcuts]
1108   close = mod4+c
1109   close_all = mod4+shift+c
1110   history = mod4+ctrl+c
1111
1112   [urgency_low]
1113   background = "#222222"
1114   foreground = "#ffffff"
1115   highlight = "#ffffff"
1116   timeout = 5
1117
1118   [urgency_normal]
1119   background = "#222222"
1120   foreground = "#ffffff"
1121   highlight = "#ffffff"
1122   timeout = 15
1123
1124   [urgency_critical]
1125   background = "#222222"
1126   foreground = "#a60000"
1127   highlight = "#ffffff"
1128   timeout = 0
1129 #+end_src
1130 ** Zathura
1131 *** Options
1132 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1133   map <C-i> recolor
1134   map <A-b> toggle_statusbar
1135   set selection-clipboard clipboard
1136   set scroll-step 200
1137
1138   set window-title-basename "true"
1139   set selection-clipboard "clipboard"
1140 #+end_src
1141 *** Colors
1142 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1143   set default-bg         "#000000"
1144   set default-fg         "#ffffff"
1145   set render-loading     true
1146   set render-loading-bg  "#000000"
1147   set render-loading-fg  "#ffffff"
1148
1149   set recolor-lightcolor "#000000" # bg
1150   set recolor-darkcolor  "#ffffff" # fg
1151   set recolor            "true"
1152 #+end_src
1153 ** Firefox
1154 *** Swap tab and URL bars
1155 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1156   #nav-bar {
1157       -moz-box-ordinal-group: 1 !important;
1158   }
1159
1160   #PersonalToolbar {
1161       -moz-box-ordinal-group: 2 !important;
1162   }
1163
1164   #titlebar {
1165       -moz-box-ordinal-group: 3 !important;
1166   }
1167 #+end_src
1168 *** Hide URL bar when not focused.
1169 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1170   #navigator-toolbox:not(:focus-within):not(:hover) {
1171       margin-top: -30px;
1172   }
1173
1174   #navigator-toolbox {
1175       transition: 0.1s margin-top ease-out;
1176   }
1177 #+end_src
1178 *** Black screen by default
1179 userChrome.css:
1180 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1181   #main-window,
1182   #browser,
1183   #browser vbox#appcontent tabbrowser,
1184   #content,
1185   #tabbrowser-tabpanels,
1186   #tabbrowser-tabbox,
1187   browser[type="content-primary"],
1188   browser[type="content"] > html,
1189   .browserContainer {
1190       background: black !important;
1191       color: #fff !important;
1192   }
1193 #+end_src
1194
1195 userContent.css:
1196 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1197   @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1198       body {
1199           background: black !important;
1200       }
1201   }
1202 #+end_src
1203 ** Xresources
1204 Modus operandi theme.
1205 #+begin_src conf :tangle ~/.Xresources
1206   ! special
1207   ,*.foreground:   #ffffff
1208   ,*.background:   #000000
1209   ,*.cursorColor:  #ffffff
1210
1211   ! black
1212   ,*.color0:       #000000
1213   ,*.color8:       #555555
1214
1215   ! red
1216   ,*.color1:       #ff8059
1217   ,*.color9:       #ffa0a0
1218
1219   ! green
1220   ,*.color2:       #00fc50
1221   ,*.color10:      #88cf88
1222
1223   ! yellow
1224   ,*.color3:       #eecc00
1225   ,*.color11:      #d2b580
1226
1227   ! blue
1228   ,*.color4:       #29aeff
1229   ,*.color12:      #92baff
1230
1231   ! magenta
1232   ,*.color5:       #feacd0
1233   ,*.color13:      #e0b2d6
1234
1235   ! cyan
1236   ,*.color6:       #00d3d0
1237   ,*.color14:      #a0bfdf
1238
1239   ! white
1240   ,*.color7:       #eeeeee
1241   ,*.color15:      #dddddd
1242 #+end_src
1243 ** Tmux
1244 #+begin_src conf :tangle ~/.tmux.conf
1245   set -g status off
1246   set -g mouse on
1247   set-window-option -g mode-keys vi
1248 #+end_src
1249 ** GPG
1250 *** Config
1251 #+begin_src conf :tangle ~/.gnupg/gpg.conf
1252   default-key 3C9ED82FFE788E4A
1253   use-agent
1254 #+end_src
1255 *** Agent
1256 #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
1257   pinentry-program /sbin/pinentry-gnome3
1258   max-cache-ttl 600
1259   default-cache-ttl 600
1260   allow-emacs-pinentry
1261 #+end_src