]> git.armaanb.net Git - config.org.git/blob - config.org
Improve irc 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 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                        (message-cite-reply-position . above)
374                        (user-mail-address . "abhojwani22@nobles.edu")
375                        (smtpmail-smtp-user . "abhojwani22@nobles.edu")
376                        (smtpmail-smtp-server . "smtp.gmail.com")))
377              ,(make-mu4e-context
378                :name "personal"
379                :enter-func (lambda () (mu4e-message "Entering personal context"))
380                :leave-func (lambda () (mu4e-message "Leaving personal context"))
381                :match-func (lambda (msg)
382                              (when msg
383                                (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
384                :vars '((mu4e-sent-folder . "/personal/Sent")
385                        (mu4e-drafts-folder . "/personal/Drafts")
386                        (mu4e-trash-folder . "/personal/Trash")
387                        (mu4e-refile-folder . "/personal/Archive")
388                        (user-mail-address . "me@armaanb.net")
389                        (message-cite-reply-position . below)
390                        (smtpmail-smtp-user . "me@armaanb.net")
391                        (smtpmail-smtp-server . "smtp.mailbox.org")))))
392     (add-to-list 'mu4e-bookmarks
393                  '(:name "Unified inbox"
394                          :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
395                          :key ?b))
396     :hook ((mu4e-compose-mode . flyspell-mode)
397            (mu4e-compose-mode . auto-fill-mode)
398            (mu4e-view-mode-hook . turn-on-visual-line-mode)))
399 #+end_src
400 ** Default browser
401 Set EWW as default browser except for videos.
402 #+begin_src emacs-lisp
403   (defun browse-url-mpv (url &optional new-window)
404     "Open URL in MPV."
405     (start-process "mpv" "*mpv*" "mpv" url))
406
407   (setq browse-url-handlers
408         (quote
409          (("youtu\\.?be" . browse-url-mpv)
410           ("peertube.*" . browse-url-mpv)
411           ("vid.*" . browse-url-mpv)
412           ("vid.*" . browse-url-mpv)
413           ("." . eww-browse-url)
414           )))
415 #+end_src
416 ** EWW
417 Some EWW enhancements.
418 *** Give buffer a useful name
419 #+begin_src emacs-lisp
420   ;; From https://protesilaos.com/dotemacs/
421   (defun prot-eww--rename-buffer ()
422     "Rename EWW buffer using page title or URL.
423         To be used by `eww-after-render-hook'."
424     (let ((name (if (eq "" (plist-get eww-data :title))
425                     (plist-get eww-data :url)
426                   (plist-get eww-data :title))))
427       (rename-buffer (format "*%s # eww*" name) t)))
428
429   (use-package eww
430     :straight (:type built-in)
431     :bind (("C-c w" . eww))
432     :hook (eww-after-render-hook prot-eww--rename-buffer))
433 #+end_src
434 *** Better entrypoint
435 #+begin_src emacs-lisp
436   ;; From https://protesilaos.com/dotemacs/
437   (defun prot-eww-browse-dwim (url &optional arg)
438     "Visit a URL, maybe from `eww-prompt-history', with completion.
439
440   With optional prefix ARG (\\[universal-argument]) open URL in a
441   new eww buffer.
442
443   If URL does not look like a valid link, run a web query using
444   `eww-search-prefix'.
445
446   When called from an eww buffer, provide the current link as
447   initial input."
448     (interactive
449      (list
450       (completing-read "Query:" eww-prompt-history
451                        nil nil (plist-get eww-data :url) 'eww-prompt-history)
452       current-prefix-arg))
453     (eww url (if arg 4 nil)))
454
455   (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
456 #+end_src
457 ** IRC
458 #+begin_src emacs-lisp
459   (use-package erc
460     :straight (:type built-in)
461     :config
462     (load "~/.emacs.d/irc.el")
463     (erc-notifications-mode 1)
464     (erc-smiley-disable)
465     :custom (erc-prompt-for-password . nil))
466
467   (use-package erc-hl-nicks
468     :config (erc-hl-nicks-mode 1))
469
470   (defun acheam-irc ()
471     "Connect to irc"
472     (interactive)
473     (erc-tls :server "irc.armaanb.net" :nick "emacs"))
474
475   (acheam-irc)
476 #+end_src
477 ** Emacs Anywhere
478 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
479 #+begin_src emacs-lisp
480   (use-package emacs-everywhere)
481 #+end_src
482 * Emacs IDE
483 ** Code cleanup
484 #+begin_src emacs-lisp
485   (use-package blacken
486     :hook (python-mode . blacken-mode)
487     :config (setq blacken-line-length 79))
488
489   ;; Purge whitespace
490   (use-package ws-butler
491     :config (ws-butler-global-mode))
492 #+end_src
493 ** Flycheck
494 #+begin_src emacs-lisp
495   (use-package flycheck
496     :config (global-flycheck-mode))
497 #+end_src
498 ** Project management
499 #+begin_src emacs-lisp
500   (use-package projectile
501     :config (projectile-mode)
502     :custom ((projectile-completion-system 'ivy))
503     :bind-keymap
504     ("C-c p" . projectile-command-map)
505     :init
506     (when (file-directory-p "~/Code")
507       (setq projectile-project-search-path '("~/Code")))
508     (setq projectile-switch-project-action #'projectile-dired))
509
510   (use-package counsel-projectile
511     :after projectile
512     :config (counsel-projectile-mode))
513 #+end_src
514 ** Dired
515 #+begin_src emacs-lisp
516   (use-package dired
517     :straight (:type built-in)
518     :commands (dired dired-jump)
519     :custom ((dired-listing-switches "-agho --group-directories-first"))
520     :config (evil-collection-define-key 'normal 'dired-mode-map
521               "h" 'dired-single-up-directory
522               "l" 'dired-single-buffer))
523
524   (use-package dired-single
525     :commands (dired dired-jump))
526
527   (use-package dired-open
528     :commands (dired dired-jump)
529     :custom (dired-open-extensions '(("png" . "feh")
530                                      ("mkv" . "mpv"))))
531
532   (use-package dired-hide-dotfiles
533     :hook (dired-mode . dired-hide-dotfiles-mode)
534     :config
535     (evil-collection-define-key 'normal 'dired-mode-map
536       "H" 'dired-hide-dotfiles-mode))
537 #+end_src
538 ** Git
539 *** Magit
540 # TODO: Write a command that commits hunk, skipping staging step.
541 #+begin_src emacs-lisp
542   (use-package magit)
543 #+end_src
544 *** Colored diff in line number area
545 #+begin_src emacs-lisp
546   (use-package diff-hl
547     :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
548     :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
549            (magit-post-refresh-hook . diff-hl-magit-post-refresh))
550     :config (global-diff-hl-mode))
551 #+end_src
552 *** Email
553 #+begin_src emacs-lisp
554   (use-package piem)
555   (use-package git-email
556     :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
557     :config (git-email-piem-mode))
558 #+end_src
559 * General text editing
560 ** Indentation
561 Indent after every change.
562 #+begin_src emacs-lisp
563   (use-package aggressive-indent
564     :config (global-aggressive-indent-mode))
565 #+end_src
566 ** Spell checking
567 Spell check in text mode, and in prog-mode comments.
568 #+begin_src emacs-lisp
569   (dolist (hook '(text-mode-hook))
570     (add-hook hook (lambda () (flyspell-mode))))
571   (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
572     (add-hook hook (lambda () (flyspell-mode -1))))
573   (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
574 #+end_src
575 ** Expand tabs to spaces
576 #+begin_src emacs-lisp
577   (setq-default tab-width 2)
578 #+end_src
579 ** Copy kill ring to clipboard
580 #+begin_src emacs-lisp
581   (setq x-select-enable-clipboard t)
582   (defun copy-kill-ring-to-xorg ()
583     "Copy the current kill ring to the xorg clipboard."
584     (interactive)
585     (x-select-text (current-kill 0)))
586 #+end_src
587 ** Save place
588 Opens file where you left it.
589 #+begin_src emacs-lisp
590   (save-place-mode)
591 #+end_src
592 ** Writing mode
593 Distraction free writing a la junegunn/goyo.
594 #+begin_src emacs-lisp
595   (use-package olivetti
596     :config
597     (evil-leader/set-key "o" 'olivetti-mode))
598 #+end_src
599 ** Abbreviations
600 Abbreviate things!
601 #+begin_src emacs-lisp
602   (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
603   (setq save-abbrevs 'silent)
604   (setq-default abbrev-mode t)
605 #+end_src
606 ** TRAMP
607 #+begin_src emacs-lisp
608   (setq tramp-default-method "ssh")
609 #+end_src
610 ** Don't ask about following symlinks in vc
611 #+begin_src emacs-lisp
612   (setq vc-follow-symlinks t)
613 #+end_src
614 ** Don't ask to save custom dictionary
615 #+begin_src emacs-lisp
616   (setq ispell-silently-savep t)
617 #+end_src
618 ** Open file as root
619 #+begin_src emacs-lisp
620   (defun doas-edit (&optional arg)
621     "Edit currently visited file as root.
622
623     With a prefix ARG prompt for a file to visit.
624     Will also prompt for a file to visit if current
625     buffer is not visiting a file.
626
627     Modified from Emacs Redux."
628     (interactive "P")
629     (if (or arg (not buffer-file-name))
630         (find-file (concat "/doas:root@localhost:"
631                            (ido-read-file-name "Find file(as root): ")))
632       (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
633
634     (global-set-key (kbd "C-x C-r") #'doas-edit)
635 #+end_src
636 * Keybindings
637 ** Switch windows
638 #+begin_src emacs-lisp
639   (use-package ace-window
640     :bind ("M-o" . ace-window))
641 #+end_src
642 ** Kill current buffer
643 Makes "C-x k" binding faster.
644 #+begin_src emacs-lisp
645   (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
646 #+end_src
647 * Other settings
648 ** OpenSCAD
649 #+begin_src emacs-lisp
650   (use-package scad-mode)
651 #+end_src
652 ** Control backup files
653 Stop backup files from spewing everywhere.
654 #+begin_src emacs-lisp
655   (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
656 #+end_src
657 ** Make yes/no easier
658 #+begin_src emacs-lisp
659   (defalias 'yes-or-no-p 'y-or-n-p)
660 #+end_src
661 ** Move customize file
662 No more clogging up init.el.
663 #+begin_src emacs-lisp
664   (setq custom-file "~/.emacs.d/custom.el")
665   (load custom-file)
666 #+end_src
667 ** Better help
668 #+begin_src emacs-lisp
669   (use-package helpful
670     :commands (helpful-callable helpful-variable helpful-command helpful-key)
671     :custom
672     (counsel-describe-function-function #'helpful-callable)
673     (counsel-describe-variable-function #'helpful-variable)
674     :bind
675     ([remap describe-function] . counsel-describe-function)
676     ([remap describe-command] . helpful-command)
677     ([remap describe-variable] . counsel-describe-variable)
678     ([remap describe-key] . helpful-key))
679 #+end_src
680 ** GPG
681 #+begin_src emacs-lisp
682   (use-package epa-file
683     :straight (:type built-in)
684     :custom
685     (epa-file-select-keys nil)
686     (epa-file-encrypt-to '("me@armaanb.net"))
687     (password-cache-expiry (* 60 15)))
688
689   (use-package pinentry
690     :config (pinentry-start))
691 #+end_src
692 ** Pastebin
693 #+begin_src emacs-lisp
694   (use-package 0x0
695     :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
696     :custom (0x0-default-service 'envs)
697     :config (evil-leader/set-key
698               "00" '0x0-upload
699               "0f" '0x0-upload-file
700               "0s" '0x0-upload-string
701               "0c" '0x0-upload-kill-ring
702               "0p" '0x0-upload-popup))
703 #+end_src
704 * Tangles
705 ** Spectrwm
706 *** General settings
707 #+begin_src conf :tangle ~/.spectrwm.conf
708   workspace_limit = 5
709   warp_pointer = 1
710   modkey = Mod4
711   autorun = ws[1]:/home/armaa/Code/scripts/autostart
712 #+end_src
713 *** Bar
714 #+begin_src conf :tangle ~/.spectrwm.conf
715   bar_enabled = 0
716   bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
717 #+end_src
718 *** Keybindings
719 **** WM actions
720 #+begin_src conf :tangle ~/.spectrwm.conf
721   program[term] = alacritty
722   program[screenshot_all] = flameshot gui
723   program[notif] = /home/armaa/Code/scripts/setter status
724   program[pass] = /home/armaa/Code/scripts/passmenu
725
726   bind[notif] = MOD+n
727   bind[pass] = MOD+Shift+p
728 #+end_src
729 **** Media keys
730 #+begin_src conf :tangle ~/.spectrwm.conf
731   program[paup] = /home/armaa/Code/scripts/setter audio +5
732   program[padown] = /home/armaa/Code/scripts/setter audio -5
733   program[pamute] = /home/armaa/Code/scripts/setter audio
734   program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
735   program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
736   program[next] = playerctl next
737   program[prev] = playerctl previous
738   program[pause] = playerctl play-pause
739
740   bind[padown] = XF86AudioLowerVolume
741   bind[paup] = XF86AudioRaiseVolume
742   bind[pamute] = XF86AudioMute
743   bind[brigdown] = XF86MonBrightnessDown
744   bind[brigup] = XF86MonBrightnessUp
745   bind[pause] = XF86AudioPlay
746   bind[next] = XF86AudioNext
747   bind[prev] = XF86AudioPrev
748 #+end_src
749 **** HJKL
750 #+begin_src conf :tangle ~/.spectrwm.conf
751   program[h] = xdotool keyup h key --clearmodifiers Left
752   program[j] = xdotool keyup j key --clearmodifiers Down
753   program[k] = xdotool keyup k key --clearmodifiers Up
754   program[l] = xdotool keyup l key --clearmodifiers Right
755
756   bind[h] = MOD + Control + h
757   bind[j] = MOD + Control + j
758   bind[k] = MOD + Control + k
759   bind[l] = MOD + Control + l
760 #+end_src
761 **** Programs
762 #+begin_src conf :tangle ~/.spectrwm.conf
763   program[email] = emacsclient -c --eval "(mu4e)"
764   program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6697")'
765   program[emacs] = emacsclient -c
766   program[firefox] = firefox
767   program[calc] = alacritty -e because -l
768   program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
769
770   bind[email] = MOD+Control+1
771   bind[irc] = MOD+Control+2
772   bind[firefox] = MOD+Control+3
773   bind[emacs-anywhere] = MOD+Control+4
774   bind[calc] = MOD+Control+5
775   bind[emacs] = MOD+Control+Return
776 #+end_src
777 **** Quirks
778 #+begin_src conf :tangle ~/.spectrwm.conf
779   quirk[Castle Menu] = FLOAT
780   quirk[momen] = FLOAT
781 #+end_src
782 ** Ash
783 *** Options
784 #+begin_src conf :tangle ~/.config/ash/ashrc
785   set -o vi
786 #+end_src
787 *** Functions
788 **** Update all packages
789 #+begin_src shell :tangle ~/.config/ash/ashrc
790   color=$(tput setaf 5)
791   reset=$(tput sgr0)
792
793   apu() {
794       doas echo "${color}== upgrading with yay ==${reset}"
795       yay
796       echo ""
797       echo "${color}== checking for pacnew files ==${reset}"
798       doas pacdiff
799       echo
800       echo "${color}== upgrading flatpaks ==${reset}"
801       flatpak update
802       echo ""
803       echo "${color}== upgrading zsh plugins ==${reset}"
804       zpe-pull
805       echo ""
806       echo "${color}== updating nvim plugins ==${reset}"
807       nvim +PlugUpdate +PlugUpgrade +qall
808       echo "Updated nvim plugins"
809       echo ""
810       echo "${color}You are entirely up to date!${reset}"
811   }
812 #+end_src
813 **** Clean all packages
814 #+begin_src shell :tangle ~/.config/ash/ashrc
815   apap() {
816       doas echo "${color}== cleaning pacman orphans ==${reset}"
817       (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
818       echo ""
819       echo "${color}== cleaning flatpaks ==${reset}"
820       flatpak remove --unused
821       echo ""
822       echo "${color}== cleaning zsh plugins ==${reset}"
823       zpe-clean
824       echo ""
825       echo "${color}== cleaning nvim plugins ==${reset}"
826       nvim +PlugClean +qall
827       echo "Cleaned nvim plugins"
828       echo ""
829       echo "${color}All orphans cleaned!${reset}"
830   }
831 #+end_src
832 **** Interact with 0x0
833 #+begin_src shell :tangle ~/.config/ash/ashrc
834   zxz="https://envs.sh"
835   ufile() { curl -F"file=@$1" "$zxz" ; }
836   upb() { curl -F"file=@-;" "$zxz" ; }
837   uurl() { curl -F"url=$1" "$zxz" ; }
838   ushort() { curl -F"shorten=$1" "$zxz" ; }
839   uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
840 #+end_src
841 **** Finger
842 #+begin_src shell :tangle ~/.config/ash/ashrc
843   finger() {
844       user=$(echo "$1" | cut -f 1 -d '@')
845       host=$(echo "$1" | cut -f 2 -d '@')
846       echo $user | nc "$host" 79 -N
847   }
848 #+end_src
849 **** Upload to ftp.armaanb.net
850 #+begin_src shell :tangle ~/.config/ash/ashrc
851   pubup() {
852       rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
853       echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
854   }
855 #+end_src
856 *** Exports
857 #+begin_src shell :tangle ~/.config/ash/ashrc
858   export EDITOR="emacsclient -c"
859   export VISUAL="$EDITOR"
860   export TERM=xterm-256color # for compatability
861
862   export GPG_TTY="$(tty)"
863   export MANPAGER='nvim +Man!'
864   export PAGER='less'
865
866   export GTK_USE_PORTAL=1
867
868   export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
869   export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
870   export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
871   export PATH="$PATH:/home/armaa/.cargo/bin"
872   export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
873   export PATH="$PATH:/usr/sbin"
874   export PATH="$PATH:/opt/FreeTube/freetube"
875
876   export LC_ALL="en_US.UTF-8"
877   export LC_CTYPE="en_US.UTF-8"
878   export LANGUAGE="en_US.UTF-8"
879
880   export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
881   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
882   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
883   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
884   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
885   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
886 #+end_src
887 *** Aliases
888 **** SSH
889 #+begin_src shell :tangle ~/.config/ash/ashrc
890   alias bhoji-drop='ssh -p 23 root@armaanb.net'
891   alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
892   alias union='ssh 192.168.1.18'
893   alias mine='ssh -p 23 root@pickupserver.cc'
894   alias tcf='ssh root@204.48.23.68'
895   alias ngmun='ssh root@157.245.89.25'
896   alias prox='ssh root@192.168.1.224'
897   alias ncq='ssh root@143.198.123.17'
898   alias envs='ssh acheam@envs.net'
899 #+end_src
900 **** File management
901 #+begin_src shell :tangle ~/.config/ash/ashrc
902   alias ls='exa -lh --icons --git --group-directories-first'
903   alias la='exa -lha --icons --git --group-directories-first'
904   alias df='df -h / /boot'
905   alias du='du -h'
906   alias free='free -h'
907   alias cp='cp -riv'
908   alias rm='rm -iv'
909   alias mv='mv -iv'
910   alias ln='ln -iv'
911   alias grep='grep -in --exclude-dir=.git --color=auto'
912   alias fname='find -name'
913   alias mkdir='mkdir -pv'
914   alias unar='atool -x'
915   alias wget='wget -e robots=off'
916   alias lanex='~/.local/share/lxc/lxc'
917   alias vim=$EDITOR
918   alias emacs=$EDITOR
919 #+end_src
920 **** System management
921 #+begin_src shell :tangle ~/.config/ash/ashrc
922   alias jctl='journalctl -p 3 -xb'
923   alias pkill='pkill -i'
924   alias cx='chmod +x'
925   alias redoas='doas $(fc -ln -1)'
926   alias crontab='crontab-argh'
927   alias sudo='doas ' # allows aliases to be run with doas
928   alias pasu='git -C ~/.password-store push'
929   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
930     yadm push'
931 #+end_src
932 **** Networking
933 #+begin_src shell :tangle ~/.config/ash/ashrc
934   alias ping='ping -c 10'
935   alias speed='speedtest-cli'
936   alias ip='ip --color=auto'
937   alias cip='curl https://armaanb.net/ip'
938   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
939   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
940   alias plan='T=$(mktemp) && \
941         rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
942         TT=$(mktemp) && \
943         head -n -2 $T > $TT && \
944         vim $TT && \
945         echo "\nLast updated: $(date -R)" >> "$TT" && \
946         fold -sw 72 "$TT" > "$T"| \
947         rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
948   alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
949 #+end_src
950 **** Other
951 #+begin_src shell :tangle ~/.config/ash/ashrc
952   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
953     iflag=fullblock status=progress'
954   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
955     iflag=fullblock status=progress'
956   alias ts='gen-shell -c task'
957   alias ts='gen-shell -c task'
958   alias tetris='autoload -Uz tetriscurses && tetriscurses'
959   alias news='newsboat'
960   alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
961   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
962     --restrict-filenames -o '%(title)s.%(ext)s'"
963   alias cal="cal -3 --color=auto"
964   alias bc='bc -l'
965 #+end_src
966 **** Virtual machines, chroots
967 #+begin_src shell :tangle ~/.config/ash/ashrc
968   alias ckiss="doas chrooter ~/Virtual/kiss"
969   alias cdebian="doas chrooter ~/Virtual/debian bash"
970   alias cwindows='devour qemu-system-x86_64 \
971     -smp 3 \
972     -cpu host \
973     -enable-kvm \
974     -m 3G \
975     -device VGA,vgamem_mb=64 \
976     -device intel-hda \
977     -device hda-duplex \
978     -net nic \
979     -net user,smb=/home/armaa/Public \
980     -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
981 #+end_src
982 **** Python
983 #+begin_src shell :tangle ~/.config/ash/ashrc
984   alias ipy="ipython"
985   alias zpy="zconda && ipython"
986   alias math="ipython --profile=math"
987   alias pypi="python setup.py sdist && twine upload dist/*"
988   alias pip="python -m pip"
989   alias black="black -l 79"
990 #+end_src
991 **** Latin
992 #+begin_src shell :tangle ~/.config/ash/ashrc
993   alias words='gen-shell -c "words"'
994   alias words-e='gen-shell -c "words ~E"'
995 #+end_src
996 **** Devour
997 #+begin_src shell :tangle ~/.config/ash/ashrc
998   alias zathura='devour zathura'
999   alias mpv='devour mpv'
1000   alias sql='devour sqlitebrowser'
1001   alias cad='devour openscad'
1002   alias feh='devour feh'
1003 #+end_src
1004 **** Package management (Pacman)
1005 #+begin_src shell :tangle ~/.config/ash/ashrc
1006   alias aps='yay -Ss'
1007   alias api='yay -Syu'
1008   alias apii='doas pacman -S'
1009   alias app='yay -Rns'
1010   alias apc='yay -Sc'
1011   alias apo='yay -Qttd'
1012   alias azf='pacman -Q | fzf'
1013   alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1014   alias ufetch='ufetch-arch'
1015   alias reflect='reflector --verbose --sort rate --save \
1016      ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1017 #+end_src
1018 **** Package management (KISS)
1019 #+begin_src shell :tangle ~/.config/ash/ashrc
1020   alias kzf="kiss s \* | xargs -l basename | \
1021     fzf --preview 'kiss search {} | xargs -l dirname'"
1022 #+end_src
1023 ** Alacritty
1024 *** Appearance
1025 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1026 font:
1027   normal:
1028     family: JetBrains Mono Nerd Font
1029     style: Medium
1030   italic:
1031     style: Italic
1032   Bold:
1033     style: Bold
1034   size: 7
1035   ligatures: true # Requires ligature patch
1036
1037 window:
1038   padding:
1039     x: 5
1040     y: 5
1041
1042 background_opacity: 1
1043 #+end_src
1044 *** Color scheme
1045 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1046 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1047 colors:
1048   # Default colors
1049   primary:
1050     background: '#000000'
1051     foreground: '#ffffff'
1052
1053   cursor:
1054     text: '#000000'
1055     background: '#ffffff'
1056
1057   # Normal colors (except green it is from intense colors)
1058   normal:
1059     black:   '#000000'
1060     red:     '#ff8059'
1061     green:   '#00fc50'
1062     yellow:  '#eecc00'
1063     blue:    '#29aeff'
1064     magenta: '#feacd0'
1065     cyan:    '#00d3d0'
1066     white:   '#eeeeee'
1067
1068   # Bright colors [all the faint colors in the modus theme]
1069   bright:
1070     black:   '#555555'
1071     red:     '#ffa0a0'
1072     green:   '#88cf88'
1073     yellow:  '#d2b580'
1074     blue:    '#92baff'
1075     magenta: '#e0b2d6'
1076     cyan:    '#a0bfdf'
1077     white:   '#ffffff'
1078
1079   # dim [all the intense colors in modus theme]
1080   dim:
1081     black:   '#222222'
1082     red:     '#fb6859'
1083     green:   '#00fc50'
1084     yellow:  '#ffdd00'
1085     blue:    '#00a2ff'
1086     magenta: '#ff8bd4'
1087     cyan:    '#30ffc0'
1088     white:   '#dddddd'
1089 #+end_src
1090 ** IPython
1091 *** General
1092 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1093 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1094   c.TerminalInteractiveShell.editing_mode = 'vi'
1095   c.InteractiveShell.colors = 'linux'
1096   c.TerminalInteractiveShell.confirm_exit = False
1097 #+end_src
1098 *** Math
1099 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1100   from math import *
1101
1102   def deg(x):
1103       return x * (180 /  pi)
1104
1105   def rad(x):
1106       return x * (pi / 180)
1107
1108   def rad(x, unit):
1109       return (x * (pi / 180)) / unit
1110
1111   def csc(x):
1112       return 1 / sin(x)
1113
1114   def sec(x):
1115       return 1 / cos(x)
1116
1117   def cot(x):
1118       return 1 / tan(x)
1119 #+end_src
1120 ** MPV
1121 Make MPV play a little bit smoother.
1122 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1123   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1124   hwdec=auto-copy
1125 #+end_src
1126 ** Inputrc
1127 For any GNU Readline programs
1128 #+begin_src conf :tangle ~/.inputrc
1129   set editing-mode emacs
1130 #+end_src
1131 ** Git
1132 *** User
1133 #+begin_src conf :tangle ~/.gitconfig
1134   [user]
1135   name = Armaan Bhojwani
1136   email = me@armaanb.net
1137   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1138 #+end_src
1139 *** Init
1140 #+begin_src conf :tangle ~/.gitconfig
1141   [init]
1142   defaultBranch = main
1143 #+end_src
1144 *** GPG
1145 #+begin_src conf :tangle ~/.gitconfig
1146   [gpg]
1147   program = gpg
1148 #+end_src
1149 *** Sendemail
1150 #+begin_src conf :tangle ~/.gitconfig
1151   [sendemail]
1152   smtpserver = smtp.mailbox.org
1153   smtpuser = me@armaanb.net
1154   smtpencryption = ssl
1155   smtpserverport = 465
1156   confirm = auto
1157 #+end_src
1158 *** Submodules
1159 #+begin_src conf :tangle ~/.gitconfig
1160   [submodule]
1161   recurse = true
1162 #+end_src
1163 *** Aliases
1164 #+begin_src conf :tangle ~/.gitconfig
1165   [alias]
1166   stat = diff --stat
1167   sclone = clone --depth 1
1168   sclean = clean -dfX
1169   a = add
1170   aa = add .
1171   c = commit
1172   quickfix = commit . --amend --no-edit
1173   p = push
1174   subup = submodule update --remote
1175   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1176   pushnc = push -o skip-ci
1177 #+end_src
1178 *** Commits
1179 #+begin_src conf :tangle ~/.gitconfig
1180   [commit]
1181   gpgsign = true
1182   verbose = true
1183 #+end_src
1184 ** Dunst
1185 Lightweight notification daemon.
1186 *** General
1187 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1188   [global]
1189   font = "JetBrains Mono Medium Nerd Font 11"
1190   allow_markup = yes
1191   format = "<b>%s</b>\n%b"
1192   sort = no
1193   indicate_hidden = yes
1194   alignment = center
1195   bounce_freq = 0
1196   show_age_threshold = 60
1197   word_wrap = yes
1198   ignore_newline = no
1199   geometry = "400x5-10+10"
1200   transparency = 0
1201   idle_threshold = 120
1202   monitor = 0
1203   sticky_history = yes
1204   line_height = 0
1205   separator_height = 1
1206   padding = 8
1207   horizontal_padding = 8
1208   max_icon_size = 32
1209   separator_color = "#ffffff"
1210   startup_notification = false
1211 #+end_src
1212 *** Modes
1213 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1214   [frame]
1215   width = 1
1216   color = "#ffffff"
1217
1218   [shortcuts]
1219   close = mod4+c
1220   close_all = mod4+shift+c
1221   history = mod4+ctrl+c
1222
1223   [urgency_low]
1224   background = "#222222"
1225   foreground = "#ffffff"
1226   highlight = "#ffffff"
1227   timeout = 5
1228
1229   [urgency_normal]
1230   background = "#222222"
1231   foreground = "#ffffff"
1232   highlight = "#ffffff"
1233   timeout = 15
1234
1235   [urgency_critical]
1236   background = "#222222"
1237   foreground = "#a60000"
1238   highlight = "#ffffff"
1239   timeout = 0
1240 #+end_src
1241 ** Zathura
1242 *** Options
1243 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1244   map <C-i> recolor
1245   map <A-b> toggle_statusbar
1246   set selection-clipboard clipboard
1247   set scroll-step 200
1248
1249   set window-title-basename "true"
1250   set selection-clipboard "clipboard"
1251 #+end_src
1252 *** Colors
1253 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1254   set default-bg         "#000000"
1255   set default-fg         "#ffffff"
1256   set render-loading     true
1257   set render-loading-bg  "#000000"
1258   set render-loading-fg  "#ffffff"
1259
1260   set recolor-lightcolor "#000000" # bg
1261   set recolor-darkcolor  "#ffffff" # fg
1262   set recolor            "true"
1263 #+end_src
1264 ** Firefox
1265 *** Swap tab and URL bars
1266 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1267   #nav-bar {
1268       -moz-box-ordinal-group: 1 !important;
1269   }
1270
1271   #PersonalToolbar {
1272       -moz-box-ordinal-group: 2 !important;
1273   }
1274
1275   #titlebar {
1276       -moz-box-ordinal-group: 3 !important;
1277   }
1278 #+end_src
1279 *** Hide URL bar when not focused.
1280 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1281   #navigator-toolbox:not(:focus-within):not(:hover) {
1282       margin-top: -30px;
1283   }
1284
1285   #navigator-toolbox {
1286       transition: 0.1s margin-top ease-out;
1287   }
1288 #+end_src
1289 ** Black screen by default
1290 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1291   #main-window,
1292   #browser,
1293   #browser vbox#appcontent tabbrowser,
1294   #content,
1295   #tabbrowser-tabpanels,
1296   #tabbrowser-tabbox,
1297   browser[type="content-primary"],
1298   browser[type="content"] > html,
1299   .browserContainer {
1300       background: black !important;
1301       color: #fff !important;
1302   }
1303 #+end_src
1304 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1305   @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1306       body {
1307           background: black !important;
1308       }
1309   }
1310 #+end_src
1311 ** Xresources
1312 *** Color scheme
1313 Modus operandi.
1314 #+begin_src conf :tangle ~/.Xresources
1315   ! special
1316   ,*.foreground:   #ffffff
1317   ,*.background:   #000000
1318   ,*.cursorColor:  #ffffff
1319
1320   ! black
1321   ,*.color0:       #000000
1322   ,*.color8:       #555555
1323
1324   ! red
1325   ,*.color1:       #ff8059
1326   ,*.color9:       #ffa0a0
1327
1328   ! green
1329   ,*.color2:       #00fc50
1330   ,*.color10:      #88cf88
1331
1332   ! yellow
1333   ,*.color3:       #eecc00
1334   ,*.color11:      #d2b580
1335
1336   ! blue
1337   ,*.color4:       #29aeff
1338   ,*.color12:      #92baff
1339
1340   ! magenta
1341   ,*.color5:       #feacd0
1342   ,*.color13:      #e0b2d6
1343
1344   ! cyan
1345   ,*.color6:       #00d3d0
1346   ,*.color14:      #a0bfdf
1347
1348   ! white
1349   ,*.color7:       #eeeeee
1350   ,*.color15:      #dddddd
1351 #+end_src
1352 *** Copy paste
1353 #+begin_src conf :tangle ~/.Xresources
1354   xterm*VT100.Translations: #override \
1355   Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1356   Ctrl Shift <Key>V:    insert-selection(CLIPBOARD) \n\
1357   Ctrl Shift <Key>C:    copy-selection(CLIPBOARD) \n\
1358   Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1359 #+end_src
1360 *** Blink cursor
1361 #+begin_src conf :tangle ~/.Xresources
1362   xterm*cursorBlink: true
1363 #+end_src
1364 *** Alt keys
1365 #+begin_src conf :tangle ~/.Xresources
1366   XTerm*eightBitInput:   false
1367   XTerm*eightBitOutput:  true
1368 #+end_src