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