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