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)
612 #+begin_src emacs-lisp
613 (defun doas-edit (&optional arg)
614 "Edit currently visited file as root.
616 With a prefix ARG prompt for a file to visit.
617 Will also prompt for a file to visit if current
618 buffer is not visiting a file.
620 Modified from Emacs Redux."
622 (if (or arg (not buffer-file-name))
623 (find-file (concat "/doas:root@localhost:"
624 (ido-read-file-name "Find file(as root): ")))
625 (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
627 (global-set-key (kbd "C-x C-r") #'doas-edit)
631 #+begin_src emacs-lisp
632 (use-package ace-window
633 :bind ("M-o" . ace-window))
635 ** Kill current buffer
636 Makes "C-x k" binding faster.
637 #+begin_src emacs-lisp
638 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
642 #+begin_src emacs-lisp
643 (use-package scad-mode)
645 ** Control backup files
646 Stop backup files from spewing everywhere.
647 #+begin_src emacs-lisp
648 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
650 ** Make yes/no easier
651 #+begin_src emacs-lisp
652 (defalias 'yes-or-no-p 'y-or-n-p)
654 ** Move customize file
655 No more clogging up init.el.
656 #+begin_src emacs-lisp
657 (setq custom-file "~/.emacs.d/custom.el")
661 #+begin_src emacs-lisp
663 :commands (helpful-callable helpful-variable helpful-command helpful-key)
665 (counsel-describe-function-function #'helpful-callable)
666 (counsel-describe-variable-function #'helpful-variable)
668 ([remap describe-function] . counsel-describe-function)
669 ([remap describe-command] . helpful-command)
670 ([remap describe-variable] . counsel-describe-variable)
671 ([remap describe-key] . helpful-key))
674 #+begin_src emacs-lisp
675 (use-package epa-file
676 :straight (:type built-in)
678 (epa-file-select-keys nil)
679 (epa-file-encrypt-to '("me@armaanb.net"))
680 (password-cache-expiry (* 60 15)))
682 (use-package pinentry
683 :config (pinentry-start))
686 #+begin_src emacs-lisp
688 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
689 :custom (0x0-default-service 'envs)
690 :config (evil-leader/set-key
692 "0f" '0x0-upload-file
693 "0s" '0x0-upload-string
694 "0c" '0x0-upload-kill-ring
695 "0p" '0x0-upload-popup))
700 #+begin_src conf :tangle ~/.spectrwm.conf
704 autorun = ws[1]:/home/armaa/Code/scripts/autostart
707 #+begin_src conf :tangle ~/.spectrwm.conf
709 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
713 #+begin_src conf :tangle ~/.spectrwm.conf
714 program[term] = alacritty
715 program[screenshot_all] = flameshot gui
716 program[notif] = /home/armaa/Code/scripts/setter status
717 program[pass] = /home/armaa/Code/scripts/passmenu
720 bind[pass] = MOD+Shift+p
723 #+begin_src conf :tangle ~/.spectrwm.conf
724 program[paup] = /home/armaa/Code/scripts/setter audio +5
725 program[padown] = /home/armaa/Code/scripts/setter audio -5
726 program[pamute] = /home/armaa/Code/scripts/setter audio
727 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
728 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
729 program[next] = playerctl next
730 program[prev] = playerctl previous
731 program[pause] = playerctl play-pause
733 bind[padown] = XF86AudioLowerVolume
734 bind[paup] = XF86AudioRaiseVolume
735 bind[pamute] = XF86AudioMute
736 bind[brigdown] = XF86MonBrightnessDown
737 bind[brigup] = XF86MonBrightnessUp
738 bind[pause] = XF86AudioPlay
739 bind[next] = XF86AudioNext
740 bind[prev] = XF86AudioPrev
743 #+begin_src conf :tangle ~/.spectrwm.conf
744 program[h] = xdotool keyup h key --clearmodifiers Left
745 program[j] = xdotool keyup j key --clearmodifiers Down
746 program[k] = xdotool keyup k key --clearmodifiers Up
747 program[l] = xdotool keyup l key --clearmodifiers Right
749 bind[h] = MOD + Control + h
750 bind[j] = MOD + Control + j
751 bind[k] = MOD + Control + k
752 bind[l] = MOD + Control + l
755 #+begin_src conf :tangle ~/.spectrwm.conf
756 program[email] = emacsclient -c --eval "(mu4e)"
757 program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6697")'
758 program[emacs] = emacsclient -c
759 program[firefox] = firefox
760 program[calc] = alacritty -e because -l
761 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
763 bind[email] = MOD+Control+1
764 bind[irc] = MOD+Control+2
765 bind[firefox] = MOD+Control+3
766 bind[emacs-anywhere] = MOD+Control+4
767 bind[calc] = MOD+Control+5
768 bind[emacs] = MOD+Control+Return
771 #+begin_src conf :tangle ~/.spectrwm.conf
772 quirk[Castle Menu] = FLOAT
777 #+begin_src conf :tangle ~/.config/ash/ashrc
781 **** Update all packages
782 #+begin_src shell :tangle ~/.config/ash/ashrc
783 color=$(tput setaf 5)
787 doas echo "${color}== upgrading with yay ==${reset}"
790 echo "${color}== checking for pacnew files ==${reset}"
793 echo "${color}== upgrading flatpaks ==${reset}"
796 echo "${color}== upgrading zsh plugins ==${reset}"
799 echo "${color}== updating nvim plugins ==${reset}"
800 nvim +PlugUpdate +PlugUpgrade +qall
801 echo "Updated nvim plugins"
803 echo "${color}You are entirely up to date!${reset}"
806 **** Clean all packages
807 #+begin_src shell :tangle ~/.config/ash/ashrc
809 doas echo "${color}== cleaning pacman orphans ==${reset}"
810 (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
812 echo "${color}== cleaning flatpaks ==${reset}"
813 flatpak remove --unused
815 echo "${color}== cleaning zsh plugins ==${reset}"
818 echo "${color}== cleaning nvim plugins ==${reset}"
819 nvim +PlugClean +qall
820 echo "Cleaned nvim plugins"
822 echo "${color}All orphans cleaned!${reset}"
825 **** Interact with 0x0
826 #+begin_src shell :tangle ~/.config/ash/ashrc
827 zxz="https://envs.sh"
828 ufile() { curl -F"file=@$1" "$zxz" ; }
829 upb() { curl -F"file=@-;" "$zxz" ; }
830 uurl() { curl -F"url=$1" "$zxz" ; }
831 ushort() { curl -F"shorten=$1" "$zxz" ; }
832 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
835 #+begin_src shell :tangle ~/.config/ash/ashrc
837 user=$(echo "$1" | cut -f 1 -d '@')
838 host=$(echo "$1" | cut -f 2 -d '@')
839 echo $user | nc "$host" 79 -N
842 **** Upload to ftp.armaanb.net
843 #+begin_src shell :tangle ~/.config/ash/ashrc
845 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
846 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
850 #+begin_src shell :tangle ~/.config/ash/ashrc
851 export EDITOR="emacsclient -c"
852 export VISUAL="$EDITOR"
853 export TERM=xterm-256color # for compatability
855 export GPG_TTY="$(tty)"
856 export MANPAGER='nvim +Man!'
859 export GTK_USE_PORTAL=1
861 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
862 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
863 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
864 export PATH="$PATH:/home/armaa/.cargo/bin"
865 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
866 export PATH="$PATH:/usr/sbin"
867 export PATH="$PATH:/opt/FreeTube/freetube"
869 export LC_ALL="en_US.UTF-8"
870 export LC_CTYPE="en_US.UTF-8"
871 export LANGUAGE="en_US.UTF-8"
873 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
874 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
875 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
876 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
877 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
878 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
882 #+begin_src shell :tangle ~/.config/ash/ashrc
883 alias bhoji-drop='ssh -p 23 root@armaanb.net'
884 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
885 alias union='ssh 192.168.1.18'
886 alias mine='ssh -p 23 root@pickupserver.cc'
887 alias tcf='ssh root@204.48.23.68'
888 alias ngmun='ssh root@157.245.89.25'
889 alias prox='ssh root@192.168.1.224'
890 alias ncq='ssh root@143.198.123.17'
891 alias envs='ssh acheam@envs.net'
894 #+begin_src shell :tangle ~/.config/ash/ashrc
895 alias ls='exa -lh --icons --git --group-directories-first'
896 alias la='exa -lha --icons --git --group-directories-first'
897 alias df='df -h / /boot'
904 alias grep='grep -in --exclude-dir=.git --color=auto'
905 alias fname='find -name'
906 alias mkdir='mkdir -pv'
907 alias unar='atool -x'
908 alias wget='wget -e robots=off'
909 alias lanex='~/.local/share/lxc/lxc'
913 **** System management
914 #+begin_src shell :tangle ~/.config/ash/ashrc
915 alias jctl='journalctl -p 3 -xb'
916 alias pkill='pkill -i'
918 alias redoas='doas $(fc -ln -1)'
919 alias crontab='crontab-argh'
920 alias sudo='doas ' # allows aliases to be run with doas
921 alias pasu='git -C ~/.password-store push'
922 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
926 #+begin_src shell :tangle ~/.config/ash/ashrc
927 alias ping='ping -c 10'
928 alias speed='speedtest-cli'
929 alias ip='ip --color=auto'
930 alias cip='curl https://armaanb.net/ip'
931 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
932 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
933 alias plan='T=$(mktemp) && \
934 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
936 head -n -2 $T > $TT && \
938 echo "\nLast updated: $(date -R)" >> "$TT" && \
939 fold -sw 72 "$TT" > "$T"| \
940 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
941 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
944 #+begin_src shell :tangle ~/.config/ash/ashrc
945 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
946 iflag=fullblock status=progress'
947 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
948 iflag=fullblock status=progress'
949 alias ts='gen-shell -c task'
950 alias ts='gen-shell -c task'
951 alias tetris='autoload -Uz tetriscurses && tetriscurses'
952 alias news='newsboat'
953 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
954 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
955 --restrict-filenames -o '%(title)s.%(ext)s'"
956 alias cal="cal -3 --color=auto"
959 **** Virtual machines, chroots
960 #+begin_src shell :tangle ~/.config/ash/ashrc
961 alias ckiss="doas chrooter ~/Virtual/kiss"
962 alias cdebian="doas chrooter ~/Virtual/debian bash"
963 alias cwindows='devour qemu-system-x86_64 \
968 -device VGA,vgamem_mb=64 \
972 -net user,smb=/home/armaa/Public \
973 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
976 #+begin_src shell :tangle ~/.config/ash/ashrc
978 alias zpy="zconda && ipython"
979 alias math="ipython --profile=math"
980 alias pypi="python setup.py sdist && twine upload dist/*"
981 alias pip="python -m pip"
982 alias black="black -l 79"
985 #+begin_src shell :tangle ~/.config/ash/ashrc
986 alias words='gen-shell -c "words"'
987 alias words-e='gen-shell -c "words ~E"'
990 #+begin_src shell :tangle ~/.config/ash/ashrc
991 alias zathura='devour zathura'
992 alias mpv='devour mpv'
993 alias sql='devour sqlitebrowser'
994 alias cad='devour openscad'
995 alias feh='devour feh'
997 **** Package management (Pacman)
998 #+begin_src shell :tangle ~/.config/ash/ashrc
1000 alias api='yay -Syu'
1001 alias apii='doas pacman -S'
1002 alias app='yay -Rns'
1004 alias apo='yay -Qttd'
1005 alias azf='pacman -Q | fzf'
1006 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1007 alias ufetch='ufetch-arch'
1008 alias reflect='reflector --verbose --sort rate --save \
1009 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1011 **** Package management (KISS)
1012 #+begin_src shell :tangle ~/.config/ash/ashrc
1013 alias kzf="kiss s \* | xargs -l basename | \
1014 fzf --preview 'kiss search {} | xargs -l dirname'"
1018 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1021 family: JetBrains Mono Nerd Font
1028 ligatures: true # Requires ligature patch
1035 background_opacity: 1
1038 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1039 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1043 background: '#000000'
1044 foreground: '#ffffff'
1048 background: '#ffffff'
1050 # Normal colors (except green it is from intense colors)
1061 # Bright colors [all the faint colors in the modus theme]
1072 # dim [all the intense colors in modus theme]
1085 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1086 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1087 c.TerminalInteractiveShell.editing_mode = 'vi'
1088 c.InteractiveShell.colors = 'linux'
1089 c.TerminalInteractiveShell.confirm_exit = False
1092 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1096 return x * (180 / pi)
1099 return x * (pi / 180)
1102 return (x * (pi / 180)) / unit
1114 Make MPV play a little bit smoother.
1115 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1116 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1120 For any GNU Readline programs
1121 #+begin_src conf :tangle ~/.inputrc
1122 set editing-mode emacs
1126 #+begin_src conf :tangle ~/.gitconfig
1128 name = Armaan Bhojwani
1129 email = me@armaanb.net
1130 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1133 #+begin_src conf :tangle ~/.gitconfig
1135 defaultBranch = main
1138 #+begin_src conf :tangle ~/.gitconfig
1143 #+begin_src conf :tangle ~/.gitconfig
1145 smtpserver = smtp.mailbox.org
1146 smtpuser = me@armaanb.net
1147 smtpencryption = ssl
1148 smtpserverport = 465
1152 #+begin_src conf :tangle ~/.gitconfig
1157 #+begin_src conf :tangle ~/.gitconfig
1160 sclone = clone --depth 1
1165 quickfix = commit . --amend --no-edit
1167 subup = submodule update --remote
1168 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1169 pushnc = push -o skip-ci
1172 #+begin_src conf :tangle ~/.gitconfig
1178 Lightweight notification daemon.
1180 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1182 font = "JetBrains Mono Medium Nerd Font 11"
1184 format = "<b>%s</b>\n%b"
1186 indicate_hidden = yes
1189 show_age_threshold = 60
1192 geometry = "400x5-10+10"
1194 idle_threshold = 120
1196 sticky_history = yes
1198 separator_height = 1
1200 horizontal_padding = 8
1202 separator_color = "#ffffff"
1203 startup_notification = false
1206 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1213 close_all = mod4+shift+c
1214 history = mod4+ctrl+c
1217 background = "#222222"
1218 foreground = "#ffffff"
1219 highlight = "#ffffff"
1223 background = "#222222"
1224 foreground = "#ffffff"
1225 highlight = "#ffffff"
1229 background = "#222222"
1230 foreground = "#a60000"
1231 highlight = "#ffffff"
1236 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1238 map <A-b> toggle_statusbar
1239 set selection-clipboard clipboard
1242 set window-title-basename "true"
1243 set selection-clipboard "clipboard"
1246 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1247 set default-bg "#000000"
1248 set default-fg "#ffffff"
1249 set render-loading true
1250 set render-loading-bg "#000000"
1251 set render-loading-fg "#ffffff"
1253 set recolor-lightcolor "#000000" # bg
1254 set recolor-darkcolor "#ffffff" # fg
1258 *** Swap tab and URL bars
1259 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1261 -moz-box-ordinal-group: 1 !important;
1265 -moz-box-ordinal-group: 2 !important;
1269 -moz-box-ordinal-group: 3 !important;
1272 *** Hide URL bar when not focused.
1273 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1274 #navigator-toolbox:not(:focus-within):not(:hover) {
1278 #navigator-toolbox {
1279 transition: 0.1s margin-top ease-out;
1282 ** Black screen by default
1283 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1286 #browser vbox#appcontent tabbrowser,
1288 #tabbrowser-tabpanels,
1290 browser[type="content-primary"],
1291 browser[type="content"] > html,
1293 background: black !important;
1294 color: #fff !important;
1297 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1298 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1300 background: black !important;
1307 #+begin_src conf :tangle ~/.Xresources
1309 ,*.foreground: #ffffff
1310 ,*.background: #000000
1311 ,*.cursorColor: #ffffff
1346 #+begin_src conf :tangle ~/.Xresources
1347 xterm*VT100.Translations: #override \
1348 Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1349 Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
1350 Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
1351 Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1354 #+begin_src conf :tangle ~/.Xresources
1355 xterm*cursorBlink: true
1358 #+begin_src conf :tangle ~/.Xresources
1359 XTerm*eightBitInput: false
1360 XTerm*eightBitOutput: true