]> git.armaanb.net Git - config.org.git/blob - config.org
Add temp straight.el fix
[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 Emacs 28 with native compilation, so some settings and packages may not be available for older versions of Emacs. This is a purely personal configuration, so while I can guarantee that it works on my setup, it might not work for you.
10 ** Choices
11 I chose to create a powerful, yet not overly heavy Emacs configuration. Things like a fancy modeline, icons, or LSP mode 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 [[*Emacs OS]]). I use email, IRC, RSS, et cetera, all through Emacs which simplifies my workflow and creates an amazingly integrated environment.
14
15 Lastly, I use Evil mode. Modal keybindings are simpler 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 near their contributions.
21 * Package management
22 ** Emacs 28 fix
23 This is temporary until some stuff gets fixed upstream
24 #+begin_src emacs-lisp
25   (setq straight-repository-branch "develop")
26   (setq straight-disable-native-compile t)
27 #+end_src
28 ** Bootstrap straight.el
29 straight.el is really nice for managing package, and it integrates nicely with use-package. It uses the bootstrapping system defined here for installation.
30 #+begin_src emacs-lisp
31   (defvar bootstrap-version)
32   (let ((bootstrap-file
33          (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
34         (bootstrap-version 5))
35     (unless (file-exists-p bootstrap-file)
36       (with-current-buffer
37           (url-retrieve-synchronously
38            "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
39            'silent 'inhibit-cookies)
40         (goto-char (point-max))
41         (eval-print-last-sexp)))
42     (load bootstrap-file nil 'nomessage))
43 #+end_src
44 ** Replace package.el with straight
45 #+begin_src emacs-lisp
46   (straight-use-package 'use-package)
47   (setq straight-use-package-by-default t)
48 #+end_src
49 * Visual options
50 ** Theme
51 Use the Modus Operandi theme by Protesilaos Stavrou. Its the best theme for Emacs by far, because how clear and readable it is. It is highly customizable, but I just set a few options here.
52 #+begin_src emacs-lisp
53   (setq modus-themes-slanted-constructs t
54         modus-themes-bold-constructs t
55         modus-themes-mode-line '3d
56         modus-themes-scale-headings t
57         modus-themes-diffs 'desaturated)
58   (load-theme 'modus-vivendi t)
59 #+end_src
60 ** Typography
61 *** Font
62 JetBrains Mono is a great programming font with ligatures. The "NF" means that it has been patched with the [[https://www.nerdfonts.com/][Nerd Fonts]].
63 #+begin_src emacs-lisp
64   (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
65 #+end_src
66 *** Ligatures
67 #+begin_src emacs-lisp
68   (use-package ligature
69     :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
70     :config
71     (ligature-set-ligatures
72      '(prog-mode text-mode)
73      '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
74        "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
75        "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
76        "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
77        "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
78        ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
79        "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
80        "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
81        "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
82        "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
83        "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
84        "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
85     (global-ligature-mode t))
86 #+end_src
87 ** Line numbers
88 Display relative line numbers except in certain modes.
89 #+begin_src emacs-lisp
90   (global-display-line-numbers-mode)
91   (setq display-line-numbers-type 'relative)
92   (dolist (no-line-num '(term-mode-hook
93                          pdf-view-mode-hook
94                          shell-mode-hook
95                          org-mode-hook
96                          eshell-mode-hook))
97     (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
98 #+end_src
99 ** Highlight matching parenthesis
100 #+begin_src emacs-lisp
101   (use-package paren
102     :config (show-paren-mode)
103     :custom (show-paren-style 'parenthesis))
104 #+end_src
105 ** Modeline
106 *** Show current function
107 #+begin_src emacs-lisp
108   (which-function-mode)
109 #+end_src
110 *** Make position in file more descriptive
111 Show current column and file size.
112 #+begin_src emacs-lisp
113   (column-number-mode)
114   (size-indication-mode)
115 #+end_src
116 *** Hide minor modes
117 #+begin_src emacs-lisp
118   (use-package minions
119     :config (minions-mode))
120 #+end_src
121 ** Ruler
122 Show a ruler at a certain number of chars depending on mode.
123 #+begin_src emacs-lisp
124   (setq display-fill-column-indicator-column 80)
125   (global-display-fill-column-indicator-mode)
126 #+end_src
127 ** Keybinding hints
128 When starting a key chord, show possible future steps after 0.3 seconds.
129 #+begin_src emacs-lisp
130   (use-package which-key
131     :config (which-key-mode)
132     :custom (which-key-idle-delay 0.3))
133 #+end_src
134 ** Highlight todo items in comments
135 #+begin_src emacs-lisp
136   (use-package hl-todo
137     :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
138     :config (global-hl-todo-mode 1))
139 #+end_src
140 ** Blink cursor
141 #+begin_src emacs-lisp
142   (blink-cursor-mode)
143 #+end_src
144 ** Visual line mode
145 Soft wrap words and do operations by visual lines except in programming modes.
146 #+begin_src emacs-lisp
147   (visual-line-mode 1)
148   (add-hook 'prog-mode-hook 'visual-line-mode 0)
149 #+end_src
150 ** Display number of matches in search
151 #+begin_src emacs-lisp
152   (use-package anzu
153     :config (global-anzu-mode))
154 #+end_src
155 ** Visual bell
156 Invert modeline color instead of audible bell or the standard visual bell.
157 #+begin_src emacs-lisp
158   (setq visible-bell nil
159         ring-bell-function
160         (lambda () (invert-face 'mode-line)
161           (run-with-timer 0.1 nil #'invert-face 'mode-line)))
162 #+end_src
163 * Evil mode
164 ** General
165 #+begin_src emacs-lisp
166   (use-package evil
167     :custom (select-enable-clipboard nil)
168     :config
169     (evil-mode)
170     (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
171     ;; Use visual line motions even outside of visual-line-mode buffers
172     (evil-global-set-key 'motion "j" 'evil-next-visual-line)
173     (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
174     (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
175 #+end_src
176 ** Evil collection
177 Evil bindings for tons of packages.
178 #+begin_src emacs-lisp
179   (use-package evil-collection
180     :after evil
181     :init (evil-collection-init)
182     :custom (evil-collection-setup-minibuffer t))
183 #+end_src
184 ** Surround
185 tpope prevails!
186 #+begin_src emacs-lisp
187   (use-package evil-surround
188     :config (global-evil-surround-mode))
189 #+end_src
190 ** Nerd commenter
191 Makes commenting super easy
192 #+begin_src emacs-lisp
193   (use-package evil-nerd-commenter
194     :bind (:map evil-normal-state-map
195                 ("gc" . evilnc-comment-or-uncomment-lines))
196     :custom (evilnc-invert-comment-line-by-line nil))
197 #+end_src
198 ** Undo redo
199 Fix the oopsies!
200 #+begin_src emacs-lisp
201   (evil-set-undo-system 'undo-redo)
202 #+end_src
203 ** Number incrementing
204 Add back C-a/C-x bindings.
205 #+begin_src emacs-lisp
206   (use-package evil-numbers
207     :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
208     :bind (:map evil-normal-state-map
209                 ("C-M-a" . evil-numbers/inc-at-pt)
210                 ("C-M-x" . evil-numbers/dec-at-pt)))
211 #+end_src
212 ** Evil org
213 #+begin_src emacs-lisp
214   (use-package evil-org
215     :after org
216     :hook (org-mode . evil-org-mode)
217     :config
218     (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
219
220   (use-package evil-org-agenda
221     :straight (:type built-in)
222     :after evil-org
223     :config (evil-org-agenda-set-keys))
224 #+end_src
225 * Org mode
226 ** General
227 #+begin_src emacs-lisp
228   (use-package org
229     :straight (:type built-in)
230     :commands (org-capture org-agenda)
231     :custom
232     (org-ellipsis " ▾")
233     (org-agenda-start-with-log-mode t)
234     (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
235     (org-log-done 'time)
236     (org-log-into-drawer t)
237     (org-src-tab-acts-natively t)
238     (org-src-fontify-natively t)
239     (org-startup-indented t)
240     (org-hide-emphasis-markers t)
241     (org-fontify-whole-block-delimiter-line nil)
242     :bind ("C-c a" . org-agenda))
243 #+end_src
244 ** Tempo
245 Define templates for lots of common structure elements. Mostly just used within this file.
246 #+begin_src emacs-lisp
247   (use-package org-tempo
248     :after org
249     :straight (:type built-in)
250     :config
251     ;; TODO: There's gotta be a more efficient way to write this
252     (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
253     (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
254     (add-to-list 'org-structure-template-alist '("ash" . "src shell :tangle ~/.config/ash/ashrc"))
255     (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
256     (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
257     (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
258     (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
259     (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
260     (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
261     (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
262     (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources"))
263     (add-to-list 'org-structure-template-alist '("tm" . "src conf :tangle ~/.tmux.conf"))
264     (add-to-list 'org-structure-template-alist '("gp" . "src conf :tangle ~/.gnupg/gpg.conf"))
265     (add-to-list 'org-structure-template-alist '("ag" . "src conf :tangle ~/.gnupg/gpg-agent.conf")))
266 #+end_src
267 * Autocompletion
268 ** Ivy
269 A well balanced completion framework.
270 #+begin_src emacs-lisp
271   (use-package ivy
272     :bind (("C-s" . swiper)
273            :map ivy-minibuffer-map
274            ("TAB" . ivy-alt-done)
275            :map ivy-switch-buffer-map
276            ("M-d" . ivy-switch-buffer-kill))
277     :config (ivy-mode))
278 #+end_src
279 ** Ivy-rich
280 #+begin_src emacs-lisp
281   (use-package ivy-rich
282     :after (ivy counsel)
283     :config (ivy-rich-mode))
284 #+end_src
285 ** Counsel
286 Ivy everywhere.
287 #+begin_src emacs-lisp
288   (use-package counsel
289     :bind (("C-M-j" . 'counsel-switch-buffer)
290            :map minibuffer-local-map
291            ("C-r" . 'counsel-minibuffer-history))
292     :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
293     :config (counsel-mode))
294 #+end_src
295 ** Remember frequent commands
296 #+begin_src emacs-lisp
297   (use-package ivy-prescient
298     :after counsel
299     :custom (ivy-prescient-enable-filtering nil)
300     :config
301     (prescient-persist-mode)
302     (ivy-prescient-mode))
303 #+end_src
304 ** Swiper
305 Better search utility.
306 #+begin_src emacs-lisp
307   (use-package swiper)
308 #+end_src
309 * Emacs OS
310 ** RSS
311 Use elfeed for reading RSS. I have another file with all the feeds in it that I'd rather keep private.
312 #+begin_src emacs-lisp
313   (use-package elfeed
314     :bind (("C-c e" . elfeed))
315     :config
316     (load "~/.emacs.d/feeds.el")
317     (add-hook 'elfeed-new-entry-hook
318               (elfeed-make-tagger :feed-url "youtube\\.com"
319                                   :add '(youtube)))
320     :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
321
322   (use-package elfeed-goodies
323     :after elfeed
324     :config (elfeed-goodies/setup))
325 #+end_src
326 ** Email
327 Use mu4e for reading emails.
328
329 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.
330
331 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.
332 #+begin_src emacs-lisp
333   (use-package smtpmail
334     :straight (:type built-in))
335   (use-package mu4e
336     :load-path "/usr/share/emacs/site-lisp/mu4e"
337     :straight (:build nil)
338     :bind (("C-c m" . mu4e))
339     :config
340     (setq user-full-name "Armaan Bhojwani"
341           smtpmail-local-domain "armaanb.net"
342           smtpmail-stream-type 'ssl
343           smtpmail-smtp-service '465
344           mu4e-change-filenames-when-moving t
345           mu4e-get-mail-command "offlineimap -q"
346           message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
347           message-citation-line-function 'message-insert-formatted-citation-line
348           mu4e-completing-read-function 'ivy-completing-read
349           mu4e-confirm-quit nil
350           mu4e-view-use-gnus t
351           mail-user-agent 'mu4e-user-agent
352           mail-context-policy 'pick-first
353           mu4e-contexts
354           `( ,(make-mu4e-context
355                :name "school"
356                :enter-func (lambda () (mu4e-message "Entering school context"))
357                :leave-func (lambda () (mu4e-message "Leaving school context"))
358                :match-func (lambda (msg)
359                              (when msg
360                                (string-match-p "^/school" (mu4e-message-field msg :maildir))))
361                :vars '((user-mail-address . "abhojwani22@nobles.edu")
362                        (mu4e-sent-folder . "/school/Sent")
363                        (mu4e-drafts-folder . "/school/Drafts")
364                        (mu4e-trash-folder . "/school/Trash")
365                        (mu4e-refile-folder . "/school/Archive")
366                        (message-cite-reply-position . above)
367                        (user-mail-address . "abhojwani22@nobles.edu")
368                        (smtpmail-smtp-user . "abhojwani22@nobles.edu")
369                        (smtpmail-smtp-server . "smtp.gmail.com")))
370              ,(make-mu4e-context
371                :name "personal"
372                :enter-func (lambda () (mu4e-message "Entering personal context"))
373                :leave-func (lambda () (mu4e-message "Leaving personal context"))
374                :match-func (lambda (msg)
375                              (when msg
376                                (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
377                :vars '((mu4e-sent-folder . "/personal/Sent")
378                        (mu4e-drafts-folder . "/personal/Drafts")
379                        (mu4e-trash-folder . "/personal/Trash")
380                        (mu4e-refile-folder . "/personal/Archive")
381                        (user-mail-address . "me@armaanb.net")
382                        (message-cite-reply-position . below)
383                        (smtpmail-smtp-user . "me@armaanb.net")
384                        (smtpmail-smtp-server . "smtp.mailbox.org")))))
385     (add-to-list 'mu4e-bookmarks
386                  '(:name "Unified inbox"
387                          :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
388                          :key ?b))
389     :hook ((mu4e-compose-mode . flyspell-mode)
390            (mu4e-compose-mode . auto-fill-mode)
391            (mu4e-view-mode-hook . turn-on-visual-line-mode)
392            (message-send-hook . (lambda () (unless (yes-or-no-p "Ya sure 'bout that?")
393                                              (signal 'quit nil))))))
394 #+end_src
395 Discourage Gnus from displaying HTML emails
396 #+begin_src emacs-lisp
397   (with-eval-after-load "mm-decode"
398     (add-to-list 'mm-discouraged-alternatives "text/html")
399     (add-to-list 'mm-discouraged-alternatives "text/richtext"))
400 #+end_src
401 ** Default browser
402 Set EWW as default browser except for videos which should open in MPV.
403 #+begin_src emacs-lisp
404   (defun browse-url-mpv (url &optional new-window)
405     "Open URL in MPV."
406     (start-process "mpv" "*mpv*" "mpv" url))
407
408   (setq browse-url-handlers
409         (quote
410          (("youtu\\.?be" . browse-url-mpv)
411           ("peertube.*" . browse-url-mpv)
412           ("vid.*" . browse-url-mpv)
413           ("vid.*" . browse-url-mpv)
414           ("." . eww-browse-url)
415           )))
416 #+end_src
417 ** EWW
418 Some EWW enhancements.
419 *** Give buffer a useful name
420 #+begin_src emacs-lisp
421   ;; From https://protesilaos.com/dotemacs/
422   (defun prot-eww--rename-buffer ()
423     "Rename EWW buffer using page title or URL.
424         To be used by `eww-after-render-hook'."
425     (let ((name (if (eq "" (plist-get eww-data :title))
426                     (plist-get eww-data :url)
427                   (plist-get eww-data :title))))
428       (rename-buffer (format "*%s # eww*" name) t)))
429
430   (use-package eww
431     :straight (:type built-in)
432     :bind (("C-c w" . eww))
433     :hook (eww-after-render-hook prot-eww--rename-buffer))
434 #+end_src
435 *** Keybinding
436 #+begin_src emacs-lisp
437   (global-set-key (kbd "C-c w") 'eww)
438 #+end_src
439 ** IRC
440 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.
441 #+begin_src emacs-lisp
442   (defun fetch-password (&rest params)
443     (require 'auth-source)
444     (let ((match (car (apply 'auth-source-search params))))
445       (if match
446           (let ((secret (plist-get match :secret)))
447             (if (functionp secret)
448                 (funcall secret)
449               secret))
450         (error "Password not found for %S" params))))
451
452   (use-package circe
453     :config
454     (enable-lui-track)
455     (enable-circe-color-nicks)
456     (circe "libera")
457     (circe "oftc")
458     (circe "tilde")
459     (setq circe-networks '(("libera"
460                             :host "irc.armaanb.net"
461                             :nick "emacs"
462                             :user "emacs"
463                             :use-tls t
464                             :port "6698"
465                             :pass (lambda (null) (fetch-password
466                                                   :login "emacs"
467                                                   :machine "irc.armaanb.net"
468                                                   :port 6698)))
469                            ("oftc"
470                             :host "irc.armaanb.net"
471                             :nick "emacs"
472                             :user "emacs"
473                             :use-tls t
474                             :port "6699"
475                             :pass (lambda (null) (fetch-password
476                                                   :login "emacs"
477                                                   :machine "irc.armaanb.net"
478                                                   :port 6699)))
479                            ("tilde"
480                             :host "irc.armaanb.net"
481                             :nick "emacs"
482                             :user "emacs"
483                             :use-tls t
484                             :port "6696"
485                             :pass (lambda (null) (fetch-password
486                                                   :login "emacs"
487                                                   :machine "irc.armaanb.net"
488                                                   :port 6696)))
489                            ))
490     :custom (circe-default-part-message "goodbye!")
491     :bind (:map circe-mode-map ("C-c C-r" . circe-reconnect-all)))
492 #+end_src
493 ** Calendar
494 Still experimenting with this setup. Not sure if I will keep it, but it works well for seeing my calendar events. I use =vdirsyncer= to sync my calendar events which I'm really not happy with.
495 #+begin_src emacs-lisp
496   (defun sync-calendar ()
497     "Sync calendars with vdirsyncer"
498     (interactive)
499     (shell-command "vdirsyncer -vcritical sync"))
500
501   (use-package calfw
502     :bind (:map cfw:calendar-mode-map ("C-S-u" . sync-calendar)))
503   (use-package calfw-ical)
504   (use-package calfw-org)
505
506   (defun acheam-calendar ()
507     "Open calendars"
508     (interactive)
509     (cfw:open-calendar-buffer
510      :contents-sources (list
511                         (cfw:org-create-source "Green")
512                         (cfw:ical-create-source
513                          "Personal"
514                          "~/.local/share/vdirsyncer/mailbox/Y2FsOi8vMC8zMQ.ics"
515                          "Gray")
516                         (cfw:ical-create-source
517                          "Personal"
518                          "~/.local/share/vdirsyncer/mailbox/Y2FsOi8vMC8zMQ.ics"
519                          "Red")
520                         (cfw:ical-create-source
521                          "School"
522                          "~/.local/share/vdirsyncer/school/abhojwani22@nobles.edu.ics"
523                          "Cyan"))
524      :view 'week))
525
526   (global-set-key (kbd "C-c c") 'acheam-calendar)
527 #+end_src
528 * Emacs IDE
529 ** Python formatting
530 #+begin_src emacs-lisp
531   (use-package blacken
532     :hook (python-mode . blacken-mode)
533     :custom (blacken-line-length 79))
534
535 #+end_src
536 ** Strip trailing whitespace
537 #+begin_src emacs-lisp
538   (use-package ws-butler
539     :config (ws-butler-global-mode))
540 #+end_src
541 ** Flycheck
542 Automatic linting. I need to look into configuring this more.
543 #+begin_src emacs-lisp
544   (use-package flycheck
545     :config (global-flycheck-mode))
546 #+end_src
547 ** Project management
548 I never use this, but apparently its very powerful. Another item on my todo list.
549 #+begin_src emacs-lisp
550   (use-package projectile
551     :config (projectile-mode)
552     :custom ((projectile-completion-system 'ivy))
553     :bind-keymap
554     ("C-c p" . projectile-command-map)
555     :init
556     (when (file-directory-p "~/Code")
557       (setq projectile-project-search-path '("~/Code")))
558     (setq projectile-switch-project-action #'projectile-dired))
559
560   (use-package counsel-projectile
561     :after projectile
562     :config (counsel-projectile-mode))
563 #+end_src
564 ** Dired
565 The best file manager!
566 #+begin_src emacs-lisp
567   (use-package dired
568     :straight (:type built-in)
569     :commands (dired dired-jump)
570     :custom ((dired-listing-switches "-agho --group-directories-first"))
571     :config (evil-collection-define-key 'normal 'dired-mode-map
572               "h" 'dired-single-up-directory
573               "l" 'dired-single-buffer))
574
575   (use-package dired-single
576     :commands (dired dired-jump))
577
578   (use-package dired-open
579     :commands (dired dired-jump)
580     :custom (dired-open-extensions '(("png" . "feh")
581                                      ("mkv" . "mpv"))))
582
583   (use-package dired-hide-dotfiles
584     :hook (dired-mode . dired-hide-dotfiles-mode)
585     :config
586     (evil-collection-define-key 'normal 'dired-mode-map
587       "H" 'dired-hide-dotfiles-mode))
588 #+end_src
589 ** Git
590 *** Magit
591 **** TODO Write a command that commits hunk, skipping staging step.
592 A very good Git interface.
593 #+begin_src emacs-lisp
594   (use-package magit)
595 #+end_src
596 *** Email
597 #+begin_src emacs-lisp
598   (use-package piem)
599   (use-package git-email
600     :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
601     :config (git-email-piem-mode))
602 #+end_src
603 * General text editing
604 ** Indentation
605 Automatically indent after every change. I'm not sure how much I like this. It slows down the editor and code sometimes ends up in a half-indented state meaning I have to manually reformat using "==" anyways.
606 #+begin_src emacs-lisp
607   (use-package aggressive-indent
608     :config (global-aggressive-indent-mode))
609 #+end_src
610 ** Spell checking
611 Spell check in text mode, and in prog-mode comments.
612 #+begin_src emacs-lisp
613   (dolist (hook '(text-mode-hook))
614     (add-hook hook (lambda () (flyspell-mode))))
615   (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
616     (add-hook hook (lambda () (flyspell-mode -1))))
617   (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
618   (setq ispell-silently-savep t)
619 #+end_src
620 ** Sane tab width
621 #+begin_src emacs-lisp
622   (setq-default tab-width 2)
623 #+end_src
624 ** Save place
625 Opens file where you left it.
626 #+begin_src emacs-lisp
627   (save-place-mode)
628 #+end_src
629 ** Writing mode
630 Distraction free writing a la junegunn/goyo.
631 #+begin_src emacs-lisp
632   (use-package olivetti
633     :bind ("C-c o" . olivetti-mode))
634 #+end_src
635 ** Abbreviations
636 Abbreviate things! I just use this for things like my email address and copyright notice.
637 #+begin_src emacs-lisp
638   (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
639   (setq save-abbrevs 'silent)
640   (setq-default abbrev-mode t)
641 #+end_src
642 ** TRAMP
643 #+begin_src emacs-lisp
644   (setq tramp-default-method "ssh")
645 #+end_src
646 ** Follow version controlled symlinks
647 #+begin_src emacs-lisp
648   (setq vc-follow-symlinks t)
649 #+end_src
650 ** Open file as root
651 #+begin_src emacs-lisp
652   (defun doas-edit (&optional arg)
653     "Edit currently visited file as root.
654
655     With a prefix ARG prompt for a file to visit.
656     Will also prompt for a file to visit if current
657     buffer is not visiting a file.
658
659     Modified from Emacs Redux."
660     (interactive "P")
661     (if (or arg (not buffer-file-name))
662         (find-file (concat "/doas:root@localhost:"
663                            (ido-read-file-name "Find file(as root): ")))
664       (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
665
666     (global-set-key (kbd "C-x C-r") #'doas-edit)
667 #+end_src
668 * Keybindings
669 ** Switch windows
670 #+begin_src emacs-lisp
671   (use-package ace-window
672     :bind ("M-o" . ace-window))
673 #+end_src
674 ** Kill current buffer
675 Makes "C-x k" binding faster.
676 #+begin_src emacs-lisp
677   (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
678 #+end_src
679 * Other settings
680 ** OpenSCAD syntax
681 #+begin_src emacs-lisp
682   (use-package scad-mode)
683 #+end_src
684 ** Control backup and lock files
685 Stop backup files from spewing everywhere.
686 #+begin_src emacs-lisp
687   (setq backup-directory-alist `(("." . "~/.emacs.d/backups"))
688         create-lockfiles nil)
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 #+end_src
731 ** Automatically clean buffers
732 Automatically close unused buffers (except those of Circe) at midnight.
733 #+begin_src emacs-lisp
734   (add-to-list 'clean-buffer-list-kill-never-regexps (lambda (buffer-name)
735                                                        (with-current-buffer buffer-name
736                                                          (derived-mode-p 'lui-mode))))
737   (midnight-mode)
738 #+end_src
739 * Tangles
740 ** Spectrwm
741 Spectrwm is a really awesome window manager! Would highly recommend.
742 *** General settings
743 #+begin_src conf :tangle ~/.spectrwm.conf
744   workspace_limit = 5
745   warp_pointer = 1
746   modkey = Mod4
747   autorun = ws[1]:/home/armaa/Code/scripts/autostart
748 #+end_src
749 *** Bar
750 Disable the bar by default (it can still be brought back up with MOD+b). The font just needs to be set to something that you have installed, otherwise spectrwm won't launch.
751 #+begin_src conf :tangle ~/.spectrwm.conf
752   bar_enabled = 0
753   bar_font = xos4 JetBrains Mono:pixelsize=14:antialias=true # any installed font
754 #+end_src
755 *** Keybindings
756 I'm not a huge fan of how spectrwm handles keybindings, probably my biggest gripe with it.
757 **** WM actions
758 #+begin_src conf :tangle ~/.spectrwm.conf
759   program[term] = st -e tmux
760   program[screenshot_all] = flameshot gui
761   program[notif] = /home/armaa/Code/scripts/setter status
762   program[pass] = /home/armaa/Code/scripts/passmenu
763
764   bind[notif] = MOD+n
765   bind[pass] = MOD+Shift+p
766 #+end_src
767 **** Media keys
768 #+begin_src conf :tangle ~/.spectrwm.conf
769   program[paup] = /home/armaa/Code/scripts/setter audio +5
770   program[padown] = /home/armaa/Code/scripts/setter audio -5
771   program[pamute] = /home/armaa/Code/scripts/setter audio
772   program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
773   program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
774   program[next] = playerctl next
775   program[prev] = playerctl previous
776   program[pause] = playerctl play-pause
777
778   bind[padown] = XF86AudioLowerVolume
779   bind[paup] = XF86AudioRaiseVolume
780   bind[pamute] = XF86AudioMute
781   bind[brigdown] = XF86MonBrightnessDown
782   bind[brigup] = XF86MonBrightnessUp
783   bind[pause] = XF86AudioPlay
784   bind[next] = XF86AudioNext
785   bind[prev] = XF86AudioPrev
786 #+end_src
787 **** HJKL
788 #+begin_src conf :tangle ~/.spectrwm.conf
789   program[h] = xdotool keyup h key --clearmodifiers Left
790   program[j] = xdotool keyup j key --clearmodifiers Down
791   program[k] = xdotool keyup k key --clearmodifiers Up
792   program[l] = xdotool keyup l key --clearmodifiers Right
793
794   bind[h] = MOD + Control + h
795   bind[j] = MOD + Control + j
796   bind[k] = MOD + Control + k
797   bind[l] = MOD + Control + l
798 #+end_src
799 **** Programs
800 #+begin_src conf :tangle ~/.spectrwm.conf
801   program[email] = emacsclient -c --eval "(mu4e)"
802   program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6698")'
803   program[rss] = emacsclient -c --eval '(elfeed)'
804   program[calendar] = emacsclient -c --eval '(acheam-calendar)'
805   program[emacs] = emacsclient -c
806   program[firefox] = firefox
807   program[calc] = st -e bc -l
808
809   bind[email] = MOD+Control+1
810   bind[irc] = MOD+Control+2
811   bind[rss] = MOD+Control+3
812   bind[calendar] = MOD+Control+4
813   bind[calc] = MOD+Control+5
814   bind[firefox] = MOD+Control+0
815   bind[emacs] = MOD+Control+Return
816 #+end_src
817 *** Quirks
818 Float some specific programs by default.
819 #+begin_src conf :tangle ~/.spectrwm.conf
820   quirk[Castle Menu] = FLOAT
821   quirk[momen] = FLOAT
822 #+end_src
823 ** Ash
824 *** Options
825 Use the vi editing mode. I still haven't found a good way to show visual feedback of the current mode. Ideally the cursor would change to a beam when in insert mode, and a box when in normal mode.
826 #+begin_src conf :tangle ~/.config/ash/ashrc
827   set -o vi
828 #+end_src
829 *** Functions
830 **** Update all packages
831 #+begin_src shell :tangle ~/.config/ash/ashrc
832   color=$(tput setaf 5)
833   reset=$(tput sgr0)
834
835   apu() {
836       doas echo "${color}== upgrading with yay ==${reset}"
837       yay
838       echo ""
839       echo "${color}== checking for pacnew files ==${reset}"
840       doas pacdiff
841       echo
842       echo "${color}== upgrading flatpaks ==${reset}"
843       flatpak update
844       echo ""
845       echo "${color}== updating nvim plugins ==${reset}"
846       nvim +PlugUpdate +PlugUpgrade +qall
847       echo "Updated nvim plugins"
848       echo ""
849       echo "${color}You are entirely up to date!${reset}"
850   }
851 #+end_src
852 **** Clean all packages
853 #+begin_src shell :tangle ~/.config/ash/ashrc
854   apap() {
855       doas echo "${color}== cleaning pacman orphans ==${reset}"
856       (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
857       echo ""
858       echo "${color}== cleaning flatpaks ==${reset}"
859       flatpak remove --unused
860       echo ""
861       echo "${color}== cleaning nvim plugins ==${reset}"
862       nvim +PlugClean +qall
863       echo "Cleaned nvim plugins"
864       echo ""
865       echo "${color}All orphans cleaned!${reset}"
866   }
867 #+end_src
868 **** Interact with 0x0
869 #+begin_src shell :tangle ~/.config/ash/ashrc
870   zxz="https://envs.sh"
871   ufile() { curl -F"file=@$1" "$zxz" ; }
872   upb() { curl -F"file=@-;" "$zxz" ; }
873   uurl() { curl -F"url=$1" "$zxz" ; }
874   ushort() { curl -F"shorten=$1" "$zxz" ; }
875   uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
876 #+end_src
877 **** Finger
878 #+begin_src shell :tangle ~/.config/ash/ashrc
879   finger() {
880       user=$(echo "$1" | cut -f 1 -d '@')
881       host=$(echo "$1" | cut -f 2 -d '@')
882       echo $user | nc "$host" 79
883   }
884 #+end_src
885 **** Upload to ftp.armaanb.net
886 #+begin_src shell :tangle ~/.config/ash/ashrc
887   pubup() {
888       rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
889       echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
890   }
891 #+end_src
892 *** Exports
893 #+begin_src shell :tangle ~/.config/ash/ashrc
894   export EDITOR="emacsclient -c"
895   export VISUAL="$EDITOR"
896   export TERM=xterm-256color # for compatability
897
898   export GPG_TTY="$(tty)"
899   export MANPAGER='nvim +Man!'
900   export PAGER='less'
901
902   export GTK_USE_PORTAL=1
903
904   export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
905   export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
906   export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
907   export PATH="$PATH:/home/armaa/.cargo/bin"
908   export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
909   export PATH="$PATH:/usr/sbin"
910   export PATH="$PATH:/opt/FreeTube/freetube"
911
912   export LC_ALL="en_US.UTF-8"
913   export LC_CTYPE="en_US.UTF-8"
914   export LANGUAGE="en_US.UTF-8"
915
916   export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
917   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
918   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
919   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
920   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
921   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
922 #+end_src
923 *** Aliases
924 **** SSH
925 #+begin_src shell :tangle ~/.config/ash/ashrc
926   alias bhoji-drop='ssh -p 23 root@armaanb.net'
927   alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
928   alias union='ssh 192.168.1.18'
929   alias mine='ssh -p 23 root@pickupserver.cc'
930   alias tcf='ssh root@204.48.23.68'
931   alias ngmun='ssh root@157.245.89.25'
932   alias prox='ssh root@192.168.1.224'
933   alias ncq='ssh root@143.198.123.17'
934   alias envs='ssh acheam@envs.net'
935 #+end_src
936 **** File management
937 #+begin_src shell :tangle ~/.config/ash/ashrc
938   alias ls='ls -lh --group-directories-first'
939   alias la='ls -A'
940   alias df='df -h / /boot'
941   alias du='du -h'
942   alias free='free -h'
943   alias cp='cp -riv'
944   alias rm='rm -iv'
945   alias mv='mv -iv'
946   alias ln='ln -v'
947   alias grep='grep -in --color=auto'
948   alias mkdir='mkdir -pv'
949   alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
950   emacs() { $EDITOR "$@" & }
951   alias vim="emacs"
952 #+end_src
953 **** System management
954 #+begin_src shell :tangle ~/.config/ash/ashrc
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 This file is used for any GNU Readline programs. I use Emacs editing mode mostly because of one annoyance which is that to clear the screen using ^L, you have to be in normal mode which is a pain. If there is a way to rebind this, I'd love to know!.
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 *** Submodule
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 *** Commit
1092 #+begin_src conf :tangle ~/.gitconfig
1093   [commit]
1094   gpgsign = true
1095   verbose = true
1096 #+end_src
1097 ** Dunst
1098 Lightweight notification daemon. Eventually I'd like to replace this with something dbus-less.
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 The best document reader!
1156 *** Options
1157 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1158   map <C-i> recolor
1159   map <A-b> toggle_statusbar
1160   set selection-clipboard clipboard
1161   set scroll-step 200
1162
1163   set window-title-basename "true"
1164   set selection-clipboard "clipboard"
1165 #+end_src
1166 *** Colors
1167 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1168   set default-bg         "#000000"
1169   set default-fg         "#ffffff"
1170   set render-loading     true
1171   set render-loading-bg  "#000000"
1172   set render-loading-fg  "#ffffff"
1173
1174   set recolor-lightcolor "#000000" # bg
1175   set recolor-darkcolor  "#ffffff" # fg
1176   set recolor            "true"
1177 #+end_src
1178 ** Firefox
1179 Just some basic Firefox CSS. Will probably have to rewrite for the Proton redesign.
1180 *** Swap tab and URL bars
1181 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1182   #nav-bar {
1183       -moz-box-ordinal-group: 1 !important;
1184   }
1185
1186   #PersonalToolbar {
1187       -moz-box-ordinal-group: 2 !important;
1188   }
1189
1190   #titlebar {
1191       -moz-box-ordinal-group: 3 !important;
1192   }
1193 #+end_src
1194 *** Hide URL bar when not focused.
1195 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1196   #navigator-toolbox:not(:focus-within):not(:hover) {
1197       margin-top: -30px;
1198   }
1199
1200   #navigator-toolbox {
1201       transition: 0.1s margin-top ease-out;
1202   }
1203 #+end_src
1204 *** Black screen by default
1205 userChrome.css:
1206 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1207   #main-window,
1208   #browser,
1209   #browser vbox#appcontent tabbrowser,
1210   #content,
1211   #tabbrowser-tabpanels,
1212   #tabbrowser-tabbox,
1213   browser[type="content-primary"],
1214   browser[type="content"] > html,
1215   .browserContainer {
1216       background: black !important;
1217       color: #fff !important;
1218   }
1219 #+end_src
1220
1221 userContent.css:
1222 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1223   @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1224       body {
1225           background: black !important;
1226       }
1227   }
1228 #+end_src
1229 ** Xresources
1230 Modus operandi theme. No program I use checks for anything beyond foreground and background, but hey, it can't hurt to have all the colors in there.
1231 #+begin_src conf :tangle ~/.Xresources
1232   ! special
1233   ,*.foreground:   #ffffff
1234   ,*.background:   #000000
1235   ,*.cursorColor:  #ffffff
1236
1237   ! black
1238   ,*.color0:       #000000
1239   ,*.color8:       #555555
1240
1241   ! red
1242   ,*.color1:       #ff8059
1243   ,*.color9:       #ffa0a0
1244
1245   ! green
1246   ,*.color2:       #00fc50
1247   ,*.color10:      #88cf88
1248
1249   ! yellow
1250   ,*.color3:       #eecc00
1251   ,*.color11:      #d2b580
1252
1253   ! blue
1254   ,*.color4:       #29aeff
1255   ,*.color12:      #92baff
1256
1257   ! magenta
1258   ,*.color5:       #feacd0
1259   ,*.color13:      #e0b2d6
1260
1261   ! cyan
1262   ,*.color6:       #00d3d0
1263   ,*.color14:      #a0bfdf
1264
1265   ! white
1266   ,*.color7:       #eeeeee
1267   ,*.color15:      #dddddd
1268 #+end_src
1269 ** Tmux
1270 I use tmux in order to keep my st build light. Still learning how it works.
1271 #+begin_src conf :tangle ~/.tmux.conf
1272   set -g status off
1273   set -g mouse on
1274   set-window-option -g mode-keys vi
1275   bind-key -T copy-mode-vi 'v' send -X begin-selection
1276   bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
1277 #+end_src
1278 ** GPG
1279 *** Config
1280 #+begin_src conf :tangle ~/.gnupg/gpg.conf
1281   default-key 3C9ED82FFE788E4A
1282   use-agent
1283 #+end_src
1284 *** Agent
1285 #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
1286   pinentry-program /sbin/pinentry-gnome3
1287   max-cache-ttl 600
1288   default-cache-ttl 600
1289   allow-emacs-pinentry
1290 #+end_src