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