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 sudo 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 sudo echo "${color}== cleaning pacman orphans ==${reset}"
792 (pacman -Qtdq | sudo 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
833 #+begin_src shell :tangle ~/.config/ash/ashrc
834 alias bhoji-drop='ssh -p 23 root@armaanb.net'
835 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
836 alias union='ssh 192.168.1.18'
837 alias mine='ssh -p 23 root@pickupserver.cc'
838 alias tcf='ssh root@204.48.23.68'
839 alias ngmun='ssh root@157.245.89.25'
840 alias prox='ssh root@192.168.1.224'
841 alias ncq='ssh root@143.198.123.17'
842 alias envs='ssh acheam@envs.net'
845 #+begin_src shell :tangle ~/.config/ash/ashrc
846 alias ls='exa -lh --icons --git --group-directories-first'
847 alias la='exa -lha --icons --git --group-directories-first'
848 alias df='df -h / /boot'
855 alias grep='grep -in --exclude-dir=.git --color=auto'
856 alias fname='find -name'
857 alias mkdir='mkdir -pv'
858 alias unar='atool -x'
859 alias wget='wget -e robots=off'
860 alias lanex='~/.local/share/lxc/lxc'
863 **** System management
864 #+begin_src shell :tangle ~/.config/ash/ashrc
865 alias jctl='journalctl -p 3 -xb'
866 alias pkill='pkill -i'
868 alias redoas='doas $(fc -ln -1)'
869 alias crontab='crontab-argh'
870 alias sudo='doas ' # allows aliases to be run with doas
871 alias pasu='git -C ~/.password-store push'
872 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
876 #+begin_src shell :tangle ~/.config/ash/ashrc
877 alias ping='ping -c 10'
878 alias speed='speedtest-cli'
879 alias ip='ip --color=auto'
880 alias cip='curl https://armaanb.net/ip'
881 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
882 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
883 alias plan='T=$(mktemp) && \
884 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
886 head -n -2 $T > $TT && \
888 echo "\nLast updated: $(date -R)" >> "$TT" && \
889 fold -sw 72 "$TT" > "$T"| \
890 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
891 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
894 #+begin_src shell :tangle ~/.config/ash/ashrc
895 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
896 iflag=fullblock status=progress'
897 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
898 iflag=fullblock status=progress'
899 alias ts='gen-shell -c task'
900 alias ts='gen-shell -c task'
901 alias tetris='autoload -Uz tetriscurses && tetriscurses'
902 alias news='newsboat'
903 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
904 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
905 --restrict-filenames -o '%(title)s.%(ext)s'"
906 alias cal="cal -3 --color=auto"
909 **** Virtual machines, chroots
910 #+begin_src shell :tangle ~/.config/ash/ashrc
911 alias ckiss="sudo chrooter ~/Virtual/kiss"
912 alias cdebian="sudo chrooter ~/Virtual/debian bash"
913 alias cwindows='devour qemu-system-x86_64 \
918 -device VGA,vgamem_mb=64 \
922 -net user,smb=/home/armaa/Public \
923 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
926 #+begin_src shell :tangle ~/.config/ash/ashrc
928 alias zpy="zconda && ipython"
929 alias math="ipython --profile=math"
930 alias pypi="python setup.py sdist && twine upload dist/*"
931 alias pip="python -m pip"
932 alias black="black -l 79"
935 #+begin_src shell :tangle ~/.config/ash/ashrc
936 alias words='gen-shell -c "words"'
937 alias words-e='gen-shell -c "words ~E"'
940 #+begin_src shell :tangle ~/.config/ash/ashrc
941 alias zathura='devour zathura'
942 alias mpv='devour mpv'
943 alias sql='devour sqlitebrowser'
944 alias cad='devour openscad'
945 alias feh='devour feh'
947 **** Package management (Pacman)
948 #+begin_src shell :tangle ~/.config/ash/ashrc
951 alias apii='sudo pacman -S'
954 alias apo='yay -Qttd'
955 alias azf='pacman -Q | fzf'
956 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
957 alias ufetch='ufetch-arch'
958 alias reflect='reflector --verbose --sort rate --save \
959 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
961 **** Package management (KISS)
962 #+begin_src shell :tangle ~/.config/ash/ashrc
963 alias kzf="kiss s \* | xargs -l basename | \
964 fzf --preview 'kiss search {} | xargs -l dirname'"
967 #+begin_src shell :tangle ~/.config/ash/ashrc
968 export EDITOR="emacsclient -c"
969 export VISUAL="$EDITOR"
970 export TERM=xterm-256color # for compatability
972 export GPG_TTY="$(tty)"
973 export MANPAGER='nvim +Man!'
976 export GTK_USE_PORTAL=1
978 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
979 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
980 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
981 export PATH="$PATH:/home/armaa/.cargo/bin"
982 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
983 export PATH="$PATH:/usr/sbin"
984 export PATH="$PATH:/opt/FreeTube/freetube"
986 export LC_ALL="en_US.UTF-8"
987 export LC_CTYPE="en_US.UTF-8"
988 export LANGUAGE="en_US.UTF-8"
990 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
991 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
992 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
993 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
994 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
995 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
999 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1002 family: JetBrains Mono Nerd Font
1009 ligatures: true # Requires ligature patch
1016 background_opacity: 1
1019 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1020 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1024 background: '#000000'
1025 foreground: '#ffffff'
1029 background: '#ffffff'
1031 # Normal colors (except green it is from intense colors)
1042 # Bright colors [all the faint colors in the modus theme]
1053 # dim [all the intense colors in modus theme]
1066 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1067 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1068 c.TerminalInteractiveShell.editing_mode = 'vi'
1069 c.InteractiveShell.colors = 'linux'
1070 c.TerminalInteractiveShell.confirm_exit = False
1073 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1077 return x * (180 / pi)
1080 return x * (pi / 180)
1083 return (x * (pi / 180)) / unit
1095 Make MPV play a little bit smoother.
1096 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1097 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1101 For any GNU Readline programs
1102 #+begin_src conf :tangle ~/.inputrc
1103 set editing-mode emacs
1107 #+begin_src conf :tangle ~/.gitconfig
1109 name = Armaan Bhojwani
1110 email = me@armaanb.net
1111 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1114 #+begin_src conf :tangle ~/.gitconfig
1116 defaultBranch = main
1119 #+begin_src conf :tangle ~/.gitconfig
1124 #+begin_src conf :tangle ~/.gitconfig
1126 smtpserver = smtp.mailbox.org
1127 smtpuser = me@armaanb.net
1128 smtpencryption = ssl
1129 smtpserverport = 465
1133 #+begin_src conf :tangle ~/.gitconfig
1138 #+begin_src conf :tangle ~/.gitconfig
1141 sclone = clone --depth 1
1146 quickfix = commit . --amend --no-edit
1148 subup = submodule update --remote
1149 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1150 pushnc = push -o skip-ci
1153 #+begin_src conf :tangle ~/.gitconfig
1159 Lightweight notification daemon.
1161 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1163 font = "JetBrains Mono Medium Nerd Font 11"
1165 format = "<b>%s</b>\n%b"
1167 indicate_hidden = yes
1170 show_age_threshold = 60
1173 geometry = "400x5-10+10"
1175 idle_threshold = 120
1177 sticky_history = yes
1179 separator_height = 1
1181 horizontal_padding = 8
1183 separator_color = "#ffffff"
1184 startup_notification = false
1187 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1194 close_all = mod4+shift+c
1195 history = mod4+ctrl+c
1198 background = "#222222"
1199 foreground = "#ffffff"
1200 highlight = "#ffffff"
1204 background = "#222222"
1205 foreground = "#ffffff"
1206 highlight = "#ffffff"
1210 background = "#222222"
1211 foreground = "#a60000"
1212 highlight = "#ffffff"
1217 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1219 map <A-b> toggle_statusbar
1220 set selection-clipboard clipboard
1223 set window-title-basename "true"
1224 set selection-clipboard "clipboard"
1227 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1228 set default-bg "#000000"
1229 set default-fg "#ffffff"
1230 set render-loading true
1231 set render-loading-bg "#000000"
1232 set render-loading-fg "#ffffff"
1234 set recolor-lightcolor "#000000" # bg
1235 set recolor-darkcolor "#ffffff" # fg
1239 *** Swap tab and URL bars
1240 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1242 -moz-box-ordinal-group: 1 !important;
1246 -moz-box-ordinal-group: 2 !important;
1250 -moz-box-ordinal-group: 3 !important;
1253 *** Hide URL bar when not focused.
1254 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1255 #navigator-toolbox:not(:focus-within):not(:hover) {
1259 #navigator-toolbox {
1260 transition: 0.1s margin-top ease-out;
1263 ** Black screen by default
1264 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1267 #browser vbox#appcontent tabbrowser,
1269 #tabbrowser-tabpanels,
1271 browser[type="content-primary"],
1272 browser[type="content"] > html,
1274 background: black !important;
1275 color: #fff !important;
1278 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1279 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1281 background: black !important;
1288 #+begin_src conf :tangle ~/.Xresources
1290 ,*.foreground: #ffffff
1291 ,*.background: #000000
1292 ,*.cursorColor: #ffffff
1327 #+begin_src conf :tangle ~/.Xresources
1328 xterm*VT100.Translations: #override \
1329 Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1330 Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
1331 Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
1332 Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1335 #+begin_src conf :tangle ~/.Xresources
1336 xterm*cursorBlink: true
1339 #+begin_src conf :tangle ~/.Xresources
1340 XTerm*eightBitInput: false
1341 XTerm*eightBitOutput: true