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