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