]> git.armaanb.net Git - config.org.git/blob - config.org
ash: remove -i flag from pkill
[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   emacs() { $EDITOR "$@" & }
952   alias vim="emacs"
953 #+end_src
954 **** System management
955 #+begin_src shell :tangle ~/.config/ash/ashrc
956   alias crontab='crontab-argh'
957   alias sudo='doas'
958   alias pasu='git -C ~/.password-store push'
959   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
960     yadm push'
961 #+end_src
962 **** Networking
963 #+begin_src shell :tangle ~/.config/ash/ashrc
964   alias ping='ping -c 10'
965   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
966   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
967   alias plan='T=$(mktemp) && \
968         rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
969         TT=$(mktemp) && \
970         head -n -2 $T > $TT && \
971         vim $TT && \
972         echo "\nLast updated: $(date -R)" >> "$TT" && \
973         fold -sw 72 "$TT" > "$T"| \
974         rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
975 #+end_src
976 **** Virtual machines, chroots
977 #+begin_src shell :tangle ~/.config/ash/ashrc
978   alias ckiss="doas chrooter ~/Virtual/kiss"
979   alias cdebian="doas chrooter ~/Virtual/debian bash"
980   alias cwindows='devour qemu-system-x86_64 \
981     -smp 3 \
982     -cpu host \
983     -enable-kvm \
984     -m 3G \
985     -device VGA,vgamem_mb=64 \
986     -device intel-hda \
987     -device hda-duplex \
988     -net nic \
989     -net user,smb=/home/armaa/Public \
990     -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
991 #+end_src
992 **** Python
993 #+begin_src shell :tangle ~/.config/ash/ashrc
994   alias pip="python -m pip"
995   alias black="black -l 79"
996 #+end_src
997 **** Latin
998 #+begin_src shell :tangle ~/.config/ash/ashrc
999   alias words='gen-shell -c "words"'
1000   alias words-e='gen-shell -c "words ~E"'
1001 #+end_src
1002 **** Devour
1003 #+begin_src shell :tangle ~/.config/ash/ashrc
1004   alias zathura='devour zathura'
1005   alias cad='devour openscad'
1006   alias feh='devour feh'
1007 #+end_src
1008 **** Pacman
1009 #+begin_src shell :tangle ~/.config/ash/ashrc
1010   alias aps='yay -Ss'
1011   alias api='yay -Syu'
1012   alias apii='doas pacman -S'
1013   alias app='yay -Rns'
1014   alias azf='pacman -Q | fzf'
1015   alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1016 #+end_src
1017 **** Other
1018 #+begin_src shell :tangle ~/.config/ash/ashrc
1019   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1020     iflag=fullblock status=progress'
1021   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1022     iflag=fullblock status=progress'
1023   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
1024     --restrict-filenames -o '%(title)s.%(ext)s'"
1025   alias cal="cal -3 --color=auto"
1026   alias bc='bc -l'
1027 #+end_src
1028 ** IPython
1029 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1030   c.TerminalInteractiveShell.editing_mode = 'vi'
1031   c.InteractiveShell.colors = 'linux'
1032   c.TerminalInteractiveShell.confirm_exit = False
1033 #+end_src
1034 ** MPV
1035 Make MPV play a little bit smoother.
1036 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1037   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1038   hwdec=auto-copy
1039 #+end_src
1040 ** Inputrc
1041 For any GNU Readline programs
1042 #+begin_src conf :tangle ~/.inputrc
1043   set editing-mode emacs
1044 #+end_src
1045 ** Git
1046 *** User
1047 #+begin_src conf :tangle ~/.gitconfig
1048   [user]
1049   name = Armaan Bhojwani
1050   email = me@armaanb.net
1051   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1052 #+end_src
1053 *** Init
1054 #+begin_src conf :tangle ~/.gitconfig
1055   [init]
1056   defaultBranch = main
1057 #+end_src
1058 *** GPG
1059 #+begin_src conf :tangle ~/.gitconfig
1060   [gpg]
1061   program = gpg
1062 #+end_src
1063 *** Sendemail
1064 #+begin_src conf :tangle ~/.gitconfig
1065   [sendemail]
1066   smtpserver = smtp.mailbox.org
1067   smtpuser = me@armaanb.net
1068   smtpencryption = ssl
1069   smtpserverport = 465
1070   confirm = auto
1071 #+end_src
1072 *** Submodules
1073 #+begin_src conf :tangle ~/.gitconfig
1074   [submodule]
1075   recurse = true
1076 #+end_src
1077 *** Aliases
1078 #+begin_src conf :tangle ~/.gitconfig
1079   [alias]
1080   stat = diff --stat
1081   sclone = clone --depth 1
1082   sclean = clean -dfX
1083   a = add
1084   aa = add .
1085   c = commit
1086   quickfix = commit . --amend --no-edit
1087   p = push
1088   subup = submodule update --remote
1089   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1090   pushnc = push -o skip-ci
1091 #+end_src
1092 *** Commits
1093 #+begin_src conf :tangle ~/.gitconfig
1094   [commit]
1095   gpgsign = true
1096   verbose = true
1097 #+end_src
1098 ** Dunst
1099 Lightweight notification daemon.
1100 *** General
1101 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1102   [global]
1103   font = "JetBrains Mono Medium Nerd Font 11"
1104   allow_markup = yes
1105   format = "<b>%s</b>\n%b"
1106   sort = no
1107   indicate_hidden = yes
1108   alignment = center
1109   bounce_freq = 0
1110   show_age_threshold = 60
1111   word_wrap = yes
1112   ignore_newline = no
1113   geometry = "400x5-10+10"
1114   transparency = 0
1115   idle_threshold = 120
1116   monitor = 0
1117   sticky_history = yes
1118   line_height = 0
1119   separator_height = 1
1120   padding = 8
1121   horizontal_padding = 8
1122   max_icon_size = 32
1123   separator_color = "#ffffff"
1124   startup_notification = false
1125 #+end_src
1126 *** Modes
1127 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1128   [frame]
1129   width = 1
1130   color = "#ffffff"
1131
1132   [shortcuts]
1133   close = mod4+c
1134   close_all = mod4+shift+c
1135   history = mod4+ctrl+c
1136
1137   [urgency_low]
1138   background = "#222222"
1139   foreground = "#ffffff"
1140   highlight = "#ffffff"
1141   timeout = 5
1142
1143   [urgency_normal]
1144   background = "#222222"
1145   foreground = "#ffffff"
1146   highlight = "#ffffff"
1147   timeout = 15
1148
1149   [urgency_critical]
1150   background = "#222222"
1151   foreground = "#a60000"
1152   highlight = "#ffffff"
1153   timeout = 0
1154 #+end_src
1155 ** Zathura
1156 *** Options
1157 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1158   map <C-i> recolor
1159   map <A-b> toggle_statusbar
1160   set selection-clipboard clipboard
1161   set scroll-step 200
1162
1163   set window-title-basename "true"
1164   set selection-clipboard "clipboard"
1165 #+end_src
1166 *** Colors
1167 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1168   set default-bg         "#000000"
1169   set default-fg         "#ffffff"
1170   set render-loading     true
1171   set render-loading-bg  "#000000"
1172   set render-loading-fg  "#ffffff"
1173
1174   set recolor-lightcolor "#000000" # bg
1175   set recolor-darkcolor  "#ffffff" # fg
1176   set recolor            "true"
1177 #+end_src
1178 ** Firefox
1179 *** Swap tab and URL bars
1180 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1181   #nav-bar {
1182       -moz-box-ordinal-group: 1 !important;
1183   }
1184
1185   #PersonalToolbar {
1186       -moz-box-ordinal-group: 2 !important;
1187   }
1188
1189   #titlebar {
1190       -moz-box-ordinal-group: 3 !important;
1191   }
1192 #+end_src
1193 *** Hide URL bar when not focused.
1194 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1195   #navigator-toolbox:not(:focus-within):not(:hover) {
1196       margin-top: -30px;
1197   }
1198
1199   #navigator-toolbox {
1200       transition: 0.1s margin-top ease-out;
1201   }
1202 #+end_src
1203 *** Black screen by default
1204 userChrome.css:
1205 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1206   #main-window,
1207   #browser,
1208   #browser vbox#appcontent tabbrowser,
1209   #content,
1210   #tabbrowser-tabpanels,
1211   #tabbrowser-tabbox,
1212   browser[type="content-primary"],
1213   browser[type="content"] > html,
1214   .browserContainer {
1215       background: black !important;
1216       color: #fff !important;
1217   }
1218 #+end_src
1219
1220 userContent.css:
1221 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1222   @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1223       body {
1224           background: black !important;
1225       }
1226   }
1227 #+end_src
1228 ** Xresources
1229 Modus operandi theme.
1230 #+begin_src conf :tangle ~/.Xresources
1231   ! special
1232   ,*.foreground:   #ffffff
1233   ,*.background:   #000000
1234   ,*.cursorColor:  #ffffff
1235
1236   ! black
1237   ,*.color0:       #000000
1238   ,*.color8:       #555555
1239
1240   ! red
1241   ,*.color1:       #ff8059
1242   ,*.color9:       #ffa0a0
1243
1244   ! green
1245   ,*.color2:       #00fc50
1246   ,*.color10:      #88cf88
1247
1248   ! yellow
1249   ,*.color3:       #eecc00
1250   ,*.color11:      #d2b580
1251
1252   ! blue
1253   ,*.color4:       #29aeff
1254   ,*.color12:      #92baff
1255
1256   ! magenta
1257   ,*.color5:       #feacd0
1258   ,*.color13:      #e0b2d6
1259
1260   ! cyan
1261   ,*.color6:       #00d3d0
1262   ,*.color14:      #a0bfdf
1263
1264   ! white
1265   ,*.color7:       #eeeeee
1266   ,*.color15:      #dddddd
1267 #+end_src
1268 ** Tmux
1269 #+begin_src conf :tangle ~/.tmux.conf
1270   set -g status off
1271   set -g mouse on
1272   set-window-option -g mode-keys vi
1273   bind-key -T copy-mode-vi 'v' send -X begin-selection
1274   bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
1275 #+end_src
1276 ** GPG
1277 *** Config
1278 #+begin_src conf :tangle ~/.gnupg/gpg.conf
1279   default-key 3C9ED82FFE788E4A
1280   use-agent
1281 #+end_src
1282 *** Agent
1283 #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
1284   pinentry-program /sbin/pinentry-gnome3
1285   max-cache-ttl 600
1286   default-cache-ttl 600
1287   allow-emacs-pinentry
1288 #+end_src