1 #+TITLE: System Configuration
2 #+DESCRIPTION: Personal system configuration in org-mode format.
3 #+AUTHOR: Armaan Bhojwani
4 #+EMAIL: me@armaanb.net
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!
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.
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.
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.
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.
17 *** TODO Turn keybinding and hook declarations into use-package declarations where possible
18 *** TODO Put configs with passwords in here with some kind of authentication
22 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.
24 ** Bootstrap straight.el
25 straight.el is really nice for managing package, and it integrates nicely with use-package. It uses the bootstrapping system defined here for installation.
26 #+begin_src emacs-lisp
27 (defvar bootstrap-version)
29 (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
30 (bootstrap-version 5))
31 (unless (file-exists-p bootstrap-file)
33 (url-retrieve-synchronously
34 "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
35 'silent 'inhibit-cookies)
36 (goto-char (point-max))
37 (eval-print-last-sexp)))
38 (load bootstrap-file nil 'nomessage))
40 ** Replace use-package with straight
41 #+begin_src emacs-lisp
42 (straight-use-package 'use-package)
43 (setq straight-use-package-by-default t)
47 Very nice high contrast theme.
49 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.
50 #+begin_src emacs-lisp
51 (setq modus-themes-slanted-constructs t
52 modus-themes-bold-constructs t
53 modus-themes-mode-line '3d
54 modus-themes-scale-headings t
55 modus-themes-diffs 'desaturated)
56 (load-theme 'modus-vivendi t)
60 Great programming font with ligatures.
61 #+begin_src emacs-lisp
62 (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
65 #+begin_src emacs-lisp
67 :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
69 (ligature-set-ligatures
70 '(prog-mode text-mode)
71 '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
72 "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
73 "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
74 "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
75 "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
76 ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
77 "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
78 "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
79 "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
80 "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
81 "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
82 "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
83 (global-ligature-mode t))
86 Display relative line numbers except in some modes
87 #+begin_src emacs-lisp
88 (global-display-line-numbers-mode)
89 (setq display-line-numbers-type 'relative)
90 (dolist (no-line-num '(term-mode-hook
95 (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
97 ** Highlight matching parenthesis
98 #+begin_src emacs-lisp
100 :config (show-paren-mode)
101 :custom (show-paren-style 'parenthesis))
104 *** Show current function
105 #+begin_src emacs-lisp
106 (which-function-mode)
108 *** Make position in file more descriptive
109 Show current column and file size.
110 #+begin_src emacs-lisp
112 (size-indication-mode)
115 #+begin_src emacs-lisp
117 :config (minions-mode))
120 Show a ruler at a certain number of chars depending on mode.
121 #+begin_src emacs-lisp
122 (setq display-fill-column-indicator-column 80)
123 (global-display-fill-column-indicator-mode)
126 Whenever starting a key chord, show possible future steps.
127 #+begin_src emacs-lisp
128 (use-package which-key
129 :config (which-key-mode)
130 :custom (which-key-idle-delay 0.3))
132 ** Highlight TODOs in comments
133 #+begin_src emacs-lisp
135 :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
136 :config (global-hl-todo-mode 1))
139 #+begin_src emacs-lisp
143 Soft wrap words and do operations by visual lines.
144 #+begin_src emacs-lisp
145 (add-hook 'text-mode-hook 'visual-line-mode 1)
147 ** Display number of matches in search
148 #+begin_src emacs-lisp
150 :config (global-anzu-mode))
153 Inverts modeline instead of audible bell or the standard visual bell.
154 #+begin_src emacs-lisp
155 (setq visible-bell nil
157 (lambda () (invert-face 'mode-line)
158 (run-with-timer 0.1 nil #'invert-face 'mode-line)))
162 #+begin_src emacs-lisp
164 :custom (select-enable-clipboard nil)
167 (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
168 ;; Use visual line motions even outside of visual-line-mode buffers
169 (evil-global-set-key 'motion "j" 'evil-next-visual-line)
170 (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
171 (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
174 #+begin_src emacs-lisp
175 (use-package evil-collection
177 :init (evil-collection-init)
178 :custom (evil-collection-setup-minibuffer t))
182 #+begin_src emacs-lisp
183 (use-package evil-surround
184 :config (global-evil-surround-mode))
187 #+begin_src emacs-lisp
188 (use-package evil-leader
189 :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
191 (evil-leader/set-leader "<SPC>")
192 (global-evil-leader-mode))
195 #+begin_src emacs-lisp
197 (use-package evil-nerd-commenter
198 :bind (:map evil-normal-state-map
199 ("gc" . evilnc-comment-or-uncomment-lines))
200 :custom (evilnc-invert-comment-line-by-line nil))
204 #+begin_src emacs-lisp
205 (evil-set-undo-system 'undo-redo)
207 ** Number incrementing
209 #+begin_src emacs-lisp
210 (use-package evil-numbers
211 :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
212 :bind (:map evil-normal-state-map
213 ("C-M-a" . evil-numbers/inc-at-pt)
214 ("C-M-x" . evil-numbers/dec-at-pt)))
218 #+begin_src emacs-lisp
219 (use-package evil-org
221 :hook (org-mode . evil-org-mode)
223 (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
224 (use-package evil-org-agenda
225 :straight (:type built-in)
227 :config (evil-org-agenda-set-keys))
230 #+begin_src emacs-lisp
231 (evil-leader/set-key-for-mode 'org-mode
232 "T" 'org-show-todo-tree
234 "c" 'org-archive-subtree)
238 #+begin_src emacs-lisp
240 :straight (:type built-in)
241 :commands (org-capture org-agenda)
244 (org-agenda-start-with-log-mode t)
245 (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
247 (org-log-into-drawer t)
248 (org-src-tab-acts-natively t)
249 (org-src-fontify-natively t)
250 (org-startup-indented t)
251 (org-hide-emphasis-markers t)
252 (org-fontify-whole-block-delimiter-line nil)
253 :bind ("C-c a" . org-agenda))
256 #+begin_src emacs-lisp
257 (use-package org-tempo
259 :straight (:type built-in)
261 ;; TODO: There's gotta be a more efficient way to write this
262 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
263 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
264 (add-to-list 'org-structure-template-alist '("ash" . "src shell :tangle ~/.config/ash/ashrc"))
265 (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
266 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
267 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
268 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
269 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
270 (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
271 (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
272 (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
273 (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources")))
277 Simple, but not too simple autocompletion.
278 #+begin_src emacs-lisp
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))
288 #+begin_src emacs-lisp
289 (use-package ivy-rich
291 :config (ivy-rich-mode))
295 #+begin_src emacs-lisp
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))
303 ** Remember frequent commands
304 #+begin_src emacs-lisp
305 (use-package ivy-prescient
308 (ivy-prescient-enable-filtering nil)
310 (prescient-persist-mode)
311 (ivy-prescient-mode))
314 Better search utility.
315 #+begin_src emacs-lisp
320 Use elfeed for RSS. I have another file with all the feeds in it.
321 #+begin_src emacs-lisp
323 :bind (("C-c e" . elfeed))
325 (load "~/.emacs.d/feeds.el")
326 (add-hook 'elfeed-new-entry-hook
327 (elfeed-make-tagger :feed-url "youtube\\.com"
329 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
331 (use-package elfeed-goodies
333 :config (elfeed-goodies/setup))
336 Use mu4e for reading emails.
338 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.
340 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.
341 #+begin_src emacs-lisp
342 (use-package smtpmail
343 :straight (:type built-in))
345 :load-path "/usr/share/emacs/site-lisp/mu4e"
346 :straight (:build nil)
347 :bind (("C-c m" . mu4e))
349 (setq user-full-name "Armaan Bhojwani"
350 smtpmail-local-domain "armaanb.net"
351 smtpmail-stream-type 'ssl
352 smtpmail-smtp-service '465
353 mu4e-change-filenames-when-moving t
354 mu4e-get-mail-command "offlineimap -q"
355 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
356 message-citation-line-function 'message-insert-formatted-citation-line
357 mu4e-completing-read-function 'ivy-completing-read
358 mu4e-confirm-quit nil
359 mail-user-agent 'mu4e-user-agent
361 `( ,(make-mu4e-context
363 :enter-func (lambda () (mu4e-message "Entering school context"))
364 :leave-func (lambda () (mu4e-message "Leaving school context"))
365 :match-func (lambda (msg)
367 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
368 :vars '((user-mail-address . "abhojwani22@nobles.edu")
369 (mu4e-sent-folder . "/school/Sent")
370 (mu4e-drafts-folder . "/school/Drafts")
371 (mu4e-trash-folder . "/school/Trash")
372 (mu4e-refile-folder . "/school/Archive")
373 (message-cite-reply-position . above)
374 (user-mail-address . "abhojwani22@nobles.edu")
375 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
376 (smtpmail-smtp-server . "smtp.gmail.com")))
379 :enter-func (lambda () (mu4e-message "Entering personal context"))
380 :leave-func (lambda () (mu4e-message "Leaving personal context"))
381 :match-func (lambda (msg)
383 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
384 :vars '((mu4e-sent-folder . "/personal/Sent")
385 (mu4e-drafts-folder . "/personal/Drafts")
386 (mu4e-trash-folder . "/personal/Trash")
387 (mu4e-refile-folder . "/personal/Archive")
388 (user-mail-address . "me@armaanb.net")
389 (message-cite-reply-position . below)
390 (smtpmail-smtp-user . "me@armaanb.net")
391 (smtpmail-smtp-server . "smtp.mailbox.org")))))
392 (add-to-list 'mu4e-bookmarks
393 '(:name "Unified inbox"
394 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
396 :hook ((mu4e-compose-mode . flyspell-mode)
397 (mu4e-compose-mode . auto-fill-mode)
398 (mu4e-view-mode-hook . turn-on-visual-line-mode)))
401 Set EWW as default browser except for videos.
402 #+begin_src emacs-lisp
403 (defun browse-url-mpv (url &optional new-window)
405 (start-process "mpv" "*mpv*" "mpv" url))
407 (setq browse-url-handlers
409 (("youtu\\.?be" . browse-url-mpv)
410 ("peertube.*" . browse-url-mpv)
411 ("vid.*" . browse-url-mpv)
412 ("vid.*" . browse-url-mpv)
413 ("." . eww-browse-url)
417 Some EWW enhancements.
418 *** Give buffer a useful name
419 #+begin_src emacs-lisp
420 ;; From https://protesilaos.com/dotemacs/
421 (defun prot-eww--rename-buffer ()
422 "Rename EWW buffer using page title or URL.
423 To be used by `eww-after-render-hook'."
424 (let ((name (if (eq "" (plist-get eww-data :title))
425 (plist-get eww-data :url)
426 (plist-get eww-data :title))))
427 (rename-buffer (format "*%s # eww*" name) t)))
430 :straight (:type built-in)
431 :bind (("C-c w" . eww))
432 :hook (eww-after-render-hook prot-eww--rename-buffer))
434 *** Better entrypoint
435 #+begin_src emacs-lisp
436 ;; From https://protesilaos.com/dotemacs/
437 (defun prot-eww-browse-dwim (url &optional arg)
438 "Visit a URL, maybe from `eww-prompt-history', with completion.
440 With optional prefix ARG (\\[universal-argument]) open URL in a
443 If URL does not look like a valid link, run a web query using
446 When called from an eww buffer, provide the current link as
450 (completing-read "Query:" eww-prompt-history
451 nil nil (plist-get eww-data :url) 'eww-prompt-history)
453 (eww url (if arg 4 nil)))
455 (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
458 #+begin_src emacs-lisp
460 :straight (:type built-in)
462 (load "~/.emacs.d/irc.el")
464 (erc-notifications-enable)
465 (erc-smiley-disable))
467 (use-package erc-hl-nicks
468 :config (erc-hl-nicks-mode 1))
471 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
472 #+begin_src emacs-lisp
473 (use-package emacs-everywhere)
477 #+begin_src emacs-lisp
479 :hook (python-mode . blacken-mode)
480 :config (setq blacken-line-length 79))
483 (use-package ws-butler
484 :config (ws-butler-global-mode))
487 #+begin_src emacs-lisp
488 (use-package flycheck
489 :config (global-flycheck-mode))
491 ** Project management
492 #+begin_src emacs-lisp
493 (use-package projectile
494 :config (projectile-mode)
495 :custom ((projectile-completion-system 'ivy))
497 ("C-c p" . projectile-command-map)
499 (when (file-directory-p "~/Code")
500 (setq projectile-project-search-path '("~/Code")))
501 (setq projectile-switch-project-action #'projectile-dired))
503 (use-package counsel-projectile
505 :config (counsel-projectile-mode))
508 #+begin_src emacs-lisp
510 :straight (:type built-in)
511 :commands (dired dired-jump)
512 :custom ((dired-listing-switches "-agho --group-directories-first"))
513 :config (evil-collection-define-key 'normal 'dired-mode-map
514 "h" 'dired-single-up-directory
515 "l" 'dired-single-buffer))
517 (use-package dired-single
518 :commands (dired dired-jump))
520 (use-package dired-open
521 :commands (dired dired-jump)
522 :custom (dired-open-extensions '(("png" . "feh")
525 (use-package dired-hide-dotfiles
526 :hook (dired-mode . dired-hide-dotfiles-mode)
528 (evil-collection-define-key 'normal 'dired-mode-map
529 "H" 'dired-hide-dotfiles-mode))
533 # TODO: Write a command that commits hunk, skipping staging step.
534 #+begin_src emacs-lisp
537 *** Colored diff in line number area
538 #+begin_src emacs-lisp
540 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
541 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
542 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
543 :config (global-diff-hl-mode))
546 #+begin_src emacs-lisp
548 (use-package git-email
549 :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
550 :config (git-email-piem-mode))
552 * General text editing
554 Indent after every change.
555 #+begin_src emacs-lisp
556 (use-package aggressive-indent
557 :config (global-aggressive-indent-mode))
560 Spell check in text mode, and in prog-mode comments.
561 #+begin_src emacs-lisp
562 (dolist (hook '(text-mode-hook))
563 (add-hook hook (lambda () (flyspell-mode))))
564 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
565 (add-hook hook (lambda () (flyspell-mode -1))))
566 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
568 ** Expand tabs to spaces
569 #+begin_src emacs-lisp
570 (setq-default tab-width 2)
572 ** Copy kill ring to clipboard
573 #+begin_src emacs-lisp
574 (setq x-select-enable-clipboard t)
575 (defun copy-kill-ring-to-xorg ()
576 "Copy the current kill ring to the xorg clipboard."
578 (x-select-text (current-kill 0)))
581 Opens file where you left it.
582 #+begin_src emacs-lisp
586 Distraction free writing a la junegunn/goyo.
587 #+begin_src emacs-lisp
588 (use-package olivetti
590 (evil-leader/set-key "o" 'olivetti-mode))
594 #+begin_src emacs-lisp
595 (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
596 (setq save-abbrevs 'silent)
597 (setq-default abbrev-mode t)
600 #+begin_src emacs-lisp
601 (setq tramp-default-method "ssh")
603 ** Don't ask about following symlinks in vc
604 #+begin_src emacs-lisp
605 (setq vc-follow-symlinks t)
607 ** Don't ask to save custom dictionary
608 #+begin_src emacs-lisp
609 (setq ispell-silently-savep t)
613 #+begin_src emacs-lisp
614 (use-package ace-window
615 :bind ("M-o" . ace-window))
617 ** Kill current buffer
618 Makes "C-x k" binding faster.
619 #+begin_src emacs-lisp
620 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
624 #+begin_src emacs-lisp
625 (use-package scad-mode)
627 ** Control backup files
628 Stop backup files from spewing everywhere.
629 #+begin_src emacs-lisp
630 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
632 ** Make yes/no easier
633 #+begin_src emacs-lisp
634 (defalias 'yes-or-no-p 'y-or-n-p)
636 ** Move customize file
637 No more clogging up init.el.
638 #+begin_src emacs-lisp
639 (setq custom-file "~/.emacs.d/custom.el")
643 #+begin_src emacs-lisp
645 :commands (helpful-callable helpful-variable helpful-command helpful-key)
647 (counsel-describe-function-function #'helpful-callable)
648 (counsel-describe-variable-function #'helpful-variable)
650 ([remap describe-function] . counsel-describe-function)
651 ([remap describe-command] . helpful-command)
652 ([remap describe-variable] . counsel-describe-variable)
653 ([remap describe-key] . helpful-key))
656 #+begin_src emacs-lisp
657 (use-package epa-file
658 :straight (:type built-in)
660 (epa-file-select-keys nil)
661 (epa-file-encrypt-to '("me@armaanb.net"))
662 (password-cache-expiry (* 60 15)))
664 (use-package pinentry
665 :config (pinentry-start))
668 #+begin_src emacs-lisp
670 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
671 :custom (0x0-default-service 'envs)
672 :config (evil-leader/set-key
674 "0f" '0x0-upload-file
675 "0s" '0x0-upload-string
676 "0c" '0x0-upload-kill-ring
677 "0p" '0x0-upload-popup))
682 #+begin_src conf :tangle ~/.spectrwm.conf
686 autorun = ws[1]:/home/armaa/Code/scripts/autostart
689 #+begin_src conf :tangle ~/.spectrwm.conf
691 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
695 #+begin_src conf :tangle ~/.spectrwm.conf
696 program[term] = alacritty
697 program[screenshot_all] = flameshot gui
698 program[notif] = /home/armaa/Code/scripts/setter status
699 program[pass] = /home/armaa/Code/scripts/passmenu
702 bind[pass] = MOD+Shift+p
705 #+begin_src conf :tangle ~/.spectrwm.conf
706 program[paup] = /home/armaa/Code/scripts/setter audio +5
707 program[padown] = /home/armaa/Code/scripts/setter audio -5
708 program[pamute] = /home/armaa/Code/scripts/setter audio
709 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
710 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
711 program[next] = playerctl next
712 program[prev] = playerctl previous
713 program[pause] = playerctl play-pause
715 bind[padown] = XF86AudioLowerVolume
716 bind[paup] = XF86AudioRaiseVolume
717 bind[pamute] = XF86AudioMute
718 bind[brigdown] = XF86MonBrightnessDown
719 bind[brigup] = XF86MonBrightnessUp
720 bind[pause] = XF86AudioPlay
721 bind[next] = XF86AudioNext
722 bind[prev] = XF86AudioPrev
725 #+begin_src conf :tangle ~/.spectrwm.conf
726 program[h] = xdotool keyup h key --clearmodifiers Left
727 program[j] = xdotool keyup j key --clearmodifiers Down
728 program[k] = xdotool keyup k key --clearmodifiers Up
729 program[l] = xdotool keyup l key --clearmodifiers Right
731 bind[h] = MOD + Control + h
732 bind[j] = MOD + Control + j
733 bind[k] = MOD + Control + k
734 bind[l] = MOD + Control + l
737 #+begin_src conf :tangle ~/.spectrwm.conf
738 program[aerc] = alacritty -e aerc
739 program[catgirl] = alacritty --hold -e sh -c "while : ; do ssh root@armaanb.net -t abduco -A irc catgirl freenode; sleep 2; done"
740 program[emacs] = emacsclient -c
741 program[firefox] = firefox
742 program[calc] = alacritty -e because -l
743 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
745 bind[aerc] = MOD+Control+1
746 bind[catgirl] = MOD+Control+2
747 bind[firefox] = MOD+Control+3
748 bind[emacs-anywhere] = MOD+Control+4
749 bind[calc] = MOD+Control+5
750 bind[emacs] = MOD+Control+Return
753 #+begin_src conf :tangle ~/.spectrwm.conf
754 quirk[Castle Menu] = FLOAT
759 #+begin_src conf :tangle ~/.config/ash/ashrc
763 **** Update all packages
764 #+begin_src shell :tangle ~/.config/ash/ashrc
765 color=$(tput setaf 5)
769 doas echo "${color}== upgrading with yay ==${reset}"
772 echo "${color}== checking for pacnew files ==${reset}"
775 echo "${color}== upgrading flatpaks ==${reset}"
778 echo "${color}== upgrading zsh plugins ==${reset}"
781 echo "${color}== updating nvim plugins ==${reset}"
782 nvim +PlugUpdate +PlugUpgrade +qall
783 echo "Updated nvim plugins"
785 echo "${color}You are entirely up to date!${reset}"
788 **** Clean all packages
789 #+begin_src shell :tangle ~/.config/ash/ashrc
791 doas echo "${color}== cleaning pacman orphans ==${reset}"
792 (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
794 echo "${color}== cleaning flatpaks ==${reset}"
795 flatpak remove --unused
797 echo "${color}== cleaning zsh plugins ==${reset}"
800 echo "${color}== cleaning nvim plugins ==${reset}"
801 nvim +PlugClean +qall
802 echo "Cleaned nvim plugins"
804 echo "${color}All orphans cleaned!${reset}"
807 **** Interact with 0x0
808 #+begin_src shell :tangle ~/.config/ash/ashrc
809 zxz="https://envs.sh"
810 ufile() { curl -F"file=@$1" "$zxz" ; }
811 upb() { curl -F"file=@-;" "$zxz" ; }
812 uurl() { curl -F"url=$1" "$zxz" ; }
813 ushort() { curl -F"shorten=$1" "$zxz" ; }
814 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
817 #+begin_src shell :tangle ~/.config/ash/ashrc
819 user=$(echo "$1" | cut -f 1 -d '@')
820 host=$(echo "$1" | cut -f 2 -d '@')
821 echo $user | nc "$host" 79 -N
824 **** Upload to ftp.armaanb.net
825 #+begin_src shell :tangle ~/.config/ash/ashrc
827 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
828 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
832 #+begin_src shell :tangle ~/.config/ash/ashrc
833 export EDITOR="emacsclient -c"
834 export VISUAL="$EDITOR"
835 export TERM=xterm-256color # for compatability
837 export GPG_TTY="$(tty)"
838 export MANPAGER='nvim +Man!'
841 export GTK_USE_PORTAL=1
843 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
844 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
845 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
846 export PATH="$PATH:/home/armaa/.cargo/bin"
847 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
848 export PATH="$PATH:/usr/sbin"
849 export PATH="$PATH:/opt/FreeTube/freetube"
851 export LC_ALL="en_US.UTF-8"
852 export LC_CTYPE="en_US.UTF-8"
853 export LANGUAGE="en_US.UTF-8"
855 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
856 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
857 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
858 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
859 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
860 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
864 #+begin_src shell :tangle ~/.config/ash/ashrc
865 alias bhoji-drop='ssh -p 23 root@armaanb.net'
866 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
867 alias union='ssh 192.168.1.18'
868 alias mine='ssh -p 23 root@pickupserver.cc'
869 alias tcf='ssh root@204.48.23.68'
870 alias ngmun='ssh root@157.245.89.25'
871 alias prox='ssh root@192.168.1.224'
872 alias ncq='ssh root@143.198.123.17'
873 alias envs='ssh acheam@envs.net'
876 #+begin_src shell :tangle ~/.config/ash/ashrc
877 alias ls='exa -lh --icons --git --group-directories-first'
878 alias la='exa -lha --icons --git --group-directories-first'
879 alias df='df -h / /boot'
886 alias grep='grep -in --exclude-dir=.git --color=auto'
887 alias fname='find -name'
888 alias mkdir='mkdir -pv'
889 alias unar='atool -x'
890 alias wget='wget -e robots=off'
891 alias lanex='~/.local/share/lxc/lxc'
895 **** System management
896 #+begin_src shell :tangle ~/.config/ash/ashrc
897 alias jctl='journalctl -p 3 -xb'
898 alias pkill='pkill -i'
900 alias redoas='doas $(fc -ln -1)'
901 alias crontab='crontab-argh'
902 alias sudo='doas ' # allows aliases to be run with doas
903 alias pasu='git -C ~/.password-store push'
904 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
908 #+begin_src shell :tangle ~/.config/ash/ashrc
909 alias ping='ping -c 10'
910 alias speed='speedtest-cli'
911 alias ip='ip --color=auto'
912 alias cip='curl https://armaanb.net/ip'
913 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
914 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
915 alias plan='T=$(mktemp) && \
916 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
918 head -n -2 $T > $TT && \
920 echo "\nLast updated: $(date -R)" >> "$TT" && \
921 fold -sw 72 "$TT" > "$T"| \
922 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
923 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
926 #+begin_src shell :tangle ~/.config/ash/ashrc
927 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
928 iflag=fullblock status=progress'
929 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
930 iflag=fullblock status=progress'
931 alias ts='gen-shell -c task'
932 alias ts='gen-shell -c task'
933 alias tetris='autoload -Uz tetriscurses && tetriscurses'
934 alias news='newsboat'
935 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
936 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
937 --restrict-filenames -o '%(title)s.%(ext)s'"
938 alias cal="cal -3 --color=auto"
941 **** Virtual machines, chroots
942 #+begin_src shell :tangle ~/.config/ash/ashrc
943 alias ckiss="doas chrooter ~/Virtual/kiss"
944 alias cdebian="doas chrooter ~/Virtual/debian bash"
945 alias cwindows='devour qemu-system-x86_64 \
950 -device VGA,vgamem_mb=64 \
954 -net user,smb=/home/armaa/Public \
955 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
958 #+begin_src shell :tangle ~/.config/ash/ashrc
960 alias zpy="zconda && ipython"
961 alias math="ipython --profile=math"
962 alias pypi="python setup.py sdist && twine upload dist/*"
963 alias pip="python -m pip"
964 alias black="black -l 79"
967 #+begin_src shell :tangle ~/.config/ash/ashrc
968 alias words='gen-shell -c "words"'
969 alias words-e='gen-shell -c "words ~E"'
972 #+begin_src shell :tangle ~/.config/ash/ashrc
973 alias zathura='devour zathura'
974 alias mpv='devour mpv'
975 alias sql='devour sqlitebrowser'
976 alias cad='devour openscad'
977 alias feh='devour feh'
979 **** Package management (Pacman)
980 #+begin_src shell :tangle ~/.config/ash/ashrc
983 alias apii='doas pacman -S'
986 alias apo='yay -Qttd'
987 alias azf='pacman -Q | fzf'
988 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
989 alias ufetch='ufetch-arch'
990 alias reflect='reflector --verbose --sort rate --save \
991 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
993 **** Package management (KISS)
994 #+begin_src shell :tangle ~/.config/ash/ashrc
995 alias kzf="kiss s \* | xargs -l basename | \
996 fzf --preview 'kiss search {} | xargs -l dirname'"
1000 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1003 family: JetBrains Mono Nerd Font
1010 ligatures: true # Requires ligature patch
1017 background_opacity: 1
1020 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1021 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1025 background: '#000000'
1026 foreground: '#ffffff'
1030 background: '#ffffff'
1032 # Normal colors (except green it is from intense colors)
1043 # Bright colors [all the faint colors in the modus theme]
1054 # dim [all the intense colors in modus theme]
1067 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1068 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1069 c.TerminalInteractiveShell.editing_mode = 'vi'
1070 c.InteractiveShell.colors = 'linux'
1071 c.TerminalInteractiveShell.confirm_exit = False
1074 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1078 return x * (180 / pi)
1081 return x * (pi / 180)
1084 return (x * (pi / 180)) / unit
1096 Make MPV play a little bit smoother.
1097 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1098 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1102 For any GNU Readline programs
1103 #+begin_src conf :tangle ~/.inputrc
1104 set editing-mode emacs
1108 #+begin_src conf :tangle ~/.gitconfig
1110 name = Armaan Bhojwani
1111 email = me@armaanb.net
1112 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1115 #+begin_src conf :tangle ~/.gitconfig
1117 defaultBranch = main
1120 #+begin_src conf :tangle ~/.gitconfig
1125 #+begin_src conf :tangle ~/.gitconfig
1127 smtpserver = smtp.mailbox.org
1128 smtpuser = me@armaanb.net
1129 smtpencryption = ssl
1130 smtpserverport = 465
1134 #+begin_src conf :tangle ~/.gitconfig
1139 #+begin_src conf :tangle ~/.gitconfig
1142 sclone = clone --depth 1
1147 quickfix = commit . --amend --no-edit
1149 subup = submodule update --remote
1150 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1151 pushnc = push -o skip-ci
1154 #+begin_src conf :tangle ~/.gitconfig
1160 Lightweight notification daemon.
1162 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1164 font = "JetBrains Mono Medium Nerd Font 11"
1166 format = "<b>%s</b>\n%b"
1168 indicate_hidden = yes
1171 show_age_threshold = 60
1174 geometry = "400x5-10+10"
1176 idle_threshold = 120
1178 sticky_history = yes
1180 separator_height = 1
1182 horizontal_padding = 8
1184 separator_color = "#ffffff"
1185 startup_notification = false
1188 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1195 close_all = mod4+shift+c
1196 history = mod4+ctrl+c
1199 background = "#222222"
1200 foreground = "#ffffff"
1201 highlight = "#ffffff"
1205 background = "#222222"
1206 foreground = "#ffffff"
1207 highlight = "#ffffff"
1211 background = "#222222"
1212 foreground = "#a60000"
1213 highlight = "#ffffff"
1218 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1220 map <A-b> toggle_statusbar
1221 set selection-clipboard clipboard
1224 set window-title-basename "true"
1225 set selection-clipboard "clipboard"
1228 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1229 set default-bg "#000000"
1230 set default-fg "#ffffff"
1231 set render-loading true
1232 set render-loading-bg "#000000"
1233 set render-loading-fg "#ffffff"
1235 set recolor-lightcolor "#000000" # bg
1236 set recolor-darkcolor "#ffffff" # fg
1240 *** Swap tab and URL bars
1241 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1243 -moz-box-ordinal-group: 1 !important;
1247 -moz-box-ordinal-group: 2 !important;
1251 -moz-box-ordinal-group: 3 !important;
1254 *** Hide URL bar when not focused.
1255 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1256 #navigator-toolbox:not(:focus-within):not(:hover) {
1260 #navigator-toolbox {
1261 transition: 0.1s margin-top ease-out;
1264 ** Black screen by default
1265 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1268 #browser vbox#appcontent tabbrowser,
1270 #tabbrowser-tabpanels,
1272 browser[type="content-primary"],
1273 browser[type="content"] > html,
1275 background: black !important;
1276 color: #fff !important;
1279 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1280 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1282 background: black !important;
1289 #+begin_src conf :tangle ~/.Xresources
1291 ,*.foreground: #ffffff
1292 ,*.background: #000000
1293 ,*.cursorColor: #ffffff
1328 #+begin_src conf :tangle ~/.Xresources
1329 xterm*VT100.Translations: #override \
1330 Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1331 Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
1332 Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
1333 Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1336 #+begin_src conf :tangle ~/.Xresources
1337 xterm*cursorBlink: true
1340 #+begin_src conf :tangle ~/.Xresources
1341 XTerm*eightBitInput: false
1342 XTerm*eightBitOutput: true