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