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