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