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